用弦截法求f(x) = 1- cos(x)ch(x)的解。 解的范围是[2 , 5]。
本帖最后由 u010119353 于 2013-11-10 20:02:16 编辑
#include <stdio.h>
#include <math.h>
int main()
{
int i;
double x[100] = {2.0, 5.0};
double f[100];
f[0] = 1 - (cos(x[0])*cosh(x[0]));
f[1] = 1 - (cos(x[1])*cosh(x[1]));
for(i=2; i<100; i++)
{
x[i] = x[i-1] - (f[i-1] * (x[i-1] - x[i-2]) / (f[i-1] - f[i-2]));
f[i] = 1 - (cos(x[i])*cosh(x[i]));
if(f[i]<0.001 && f[i]>-0.001)
break;
}
printf("%f\n", x[i]);
return 0;
}
这两句等价?
f(X2) = f(X1) - f(X1)(X2 - X1)/(f(X2)-f(X1))
x[i] = x[i-1] - (f[i-1] * (x[i-1] - x[i-2]) / (f[i-1] - f[i-2]));
1)i<100,不能保证精度是0.001
2)if(f[i]<0.001 && f[i]>-0.001)
break;
这个判断也是不对的
应该是 abs(f[i]-f[i-1])<0.001 才对。
精度问题还不是大问题,关键是求出来的解不对,差的很大。 不用数组的话迭代有点不方便吧
#include <stdio.h>
#include <math.h>
#include <math.h>
#define N 100000 //最多迭代次数,防止发散
int main()
{
int i;
double x,x1 = 2.0,x2= 5.0;
double f,f1,f2;
f1 = 1 - (cos(x1)*cosh(x1));
f2 = 1 - (cos(x2)*cosh(x2));
for(i=0;i<N;i++)
{
x = x1 - f1 * (x1 - x2 ) / (f1 - f2);
f = 1 - cos(x) * cosh(x);
if(fabs(f-f1)<0.001)
break;
x2 = x1;
x1 = x;
f2 = f1;
f1 = f;
}
printf("%lf\n", x);
//printf("i=%d,x1= %lf,x2= %lf,f1 = %lf,f2 = %lf\n",i, x1,x2,f1,f2);
return 0;
}