使用弦截法解方程通用方法

奉献一个使用弦截法解方程的方法,不足之处欢迎大家提出宝贵意见;

 

//弦截法求x*x*x-5*x*x+16*x-80=0的根
//求x^3-5x^2+16x-80的值:
#include<math.h>

double Fun(double x)
{ //计算f(x)的值
	return x*(x*x-5*x+16)-80;//求解的的函数(一元函数)
}

double Fun2(double x)
{ 
	//计算f(x)的值
	return 1 - (cos(x)*cosh(x)); 
}

BOOL SolveEquation(double xa,double xb,double(*Fun)(double),double& Val,double mErr)
{
	//作者:Worldy
	//按给定的区间[x1,x2]就方程的解,Fun为曲线函数,可以任意的一元函数
	//输入两个数x1,x2
	double x1,y1,x2,y2;
	double x,y;
	x1=xa;
	x2=xb;
	char* p= (char*)&y+7;
	char* p1=(char*)&y1+7;
	char* p2=(char*)&y2+7;
	//p=p+7;
	//p1=p1+7;
	//p2=p2+7;
	int n=0;

	//计算初始断点的函数值:
	y1=Fun(x1);
	y2=Fun(x2);

	while(n<10000)//确保其不会死循环
	{
		if (char(*p1 ^ *p2)>=0)//大于等于0,表示y1和y2同号,指定的区间范围有问题
			return FALSE;
		
		if (y2==y1)//计算过程保证y1,y2异号,如果只有0才可能相等
		{
			Val=y1;
			return TRUE;
		}

		x=(x1*y2-x2*y1)/(y2-y1);//计算两点(x1,y1)(x2,y2)连线和x轴交点的值
		y=Fun(x);

		if (fabs(y) < mErr)
		{
			Val=x;
/*#ifdef _DEBUG
			DEBUG_TRACE("替代次数:",n);
#endif*/
			return TRUE;
		}

		if(char(*p ^ *p1)>=0)	//y和y1同号
		{
			//将端点1移动到(x,y)位置
			x1=x;
			y1=y;
		}
		else
		{
			//将端点2移动到(x,y)
			x2=x;
			y2=y;
		}
		n++;
	}
	return TRUE;
}

void aTest()
{
	double mVal;
	//SolveEquation(-5,15,Fun,mVal,0.00001);
	SolveEquation(2,5,Fun2,mVal,0.00001);
	CString cs;
	cs.Format(_T("解为:%f"),mVal);
	AfxMessageBox(cs);
}


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值