首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

用弦截法求f(x) = 1- cos(x)ch(x)的解。 解的范畴是[2 , 5]

2013-12-06 
用弦截法求f(x) 1- cos(x)ch(x)的解。 解的范围是[2 , 5]。本帖最后由 u010119353 于 2013-11-10 20:02:16

用弦截法求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]));
这两句等价?
[解决办法]
引用:
Quote: 引用:


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
 

[解决办法]
引用:
Quote: 引用:

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]; }

热点排行