奉献一个使用弦截法解方程的方法,不足之处欢迎大家提出宝贵意见;
//弦截法求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);
}