用弦截法求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)), 要求精度是0.001 就是迭代法
上面代码为什么算出的结果不对?????
[解决办法]
有没有算出单调区间?
你确定,你的迭代是收敛的吗??
[解决办法]
这两句等价?
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]));
[解决办法]
...好吧,我只是觉得上面的X1、X2和下面的x[i]之类的对不起来,比如(X2)-f(X1)变成了f[i-1] - f[i-2]),而之前还是X1对应x[i-1]。
[解决办法]
1)i<100,不能保证精度是0.001
2)if(f[i]<0.001 && f[i]>-0.001)
break;
这个判断也是不对的
应该是 abs(f[i]-f[i-1])<0.001 才对。
[解决办法]
建议不要用数组,
直接用三个数据,比如 f,fa,fb
[解决办法]
1)i<100,不能保证精度是0.001
2)if(f[i]<0.001 && f[i]>-0.001)
break;
这个判断也是不对的
应该是 abs(f[i]-f[i-1])<0.001 才对。
精度问题还不是大问题,关键是求出来的解不对,差的很大。 不用数组的话迭代有点不方便吧
if(f[i]<0.001 && f[i]>-0.001)
break;
不完全是精度问题,这是迭代结束的条件。
只要两次得到的结果之差 ,小于0.001 就满足要求了。
否则,可能会差别很大,或者精度太高,做了许多无用功。
这里只有三个数据
xi ,xi-1,xi-2 //
fi,fi-1,fi-2; //
直接定义成 x,x1,x2
f,f1,f2
你改成这样试试:
#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;
}
[解决办法]
那你看看函数是否由若干个极值点
只需要其中的一段计算即可。
如果需要都求出来。
分段计算,即可。
[解决办法]
4.730041?
[解决办法]
http://blog.csdn.net/worldy/article/details/15341449
[解决办法]
每次求完x[i]的值,要保证f[i]与f[i-1]的值为异号,如为同号,要把x[i-2]的值赋给x[i-1],
在17行加上一条语句试试。
if(f[i]>0&&f[i-1]>0
[解决办法]
f[i]<0&&f[x-1]<0)
{ x[i-1]=x[i-2]; f[i-1]=f[i-2]; }