求:利用迭代法求非线性方程x^3-3x-1=0的三个实数根(∑=10^-8)的C程序 高人进啊~~~救命啊~~~
最好能够分别用简单迭代法,牛顿迭代法,和快速弦截法编写
希望高人能够指点 谢谢~~~~
问题点数:100、回复次数:8Top
1 楼zhang_jiang(Solar)回复于 2005-05-14 10:23:32 得分 100
简单迭代:
x^3-3x-1=0
=> x = (3x + 1)^(1/3)
先假设一个解x0, 每次将x0代入上式右边, 求得左边的x, 然后比较x, x0,
若|x-x0|<10^(-8), 结束, 否则, x0<-x, 继续上面过程.
Top
2 楼NowCan(城市浪人)回复于 2005-05-14 10:28:58 得分 0
这样只能算出一个根来。牛顿迭代要先求出导函数表达式,根据导函数的正负应该可以预估3个初始解。Top
3 楼zhang_jiang(Solar)回复于 2005-05-14 10:30:29 得分 0
牛顿迭代法:
f(int x0)
{
int x, x1;
x = x0; // 自己给定猜解
do{
x1 = x - (x*x*x - 3*x -1)/(3*x*x-3);
}while(abs(x-x1)<1.0e-8); // 最后的x1就是解
}Top
4 楼zhang_jiang(Solar)回复于 2005-05-14 10:32:55 得分 0
> 这样只能算出一个根来。牛顿迭代要先求出导函数表达式,根据导函数的正负应该可以预估3个初始解。
每次当然只能求一个根了, 要看你给的猜解在哪个范围, 以及它怎么收敛了.
Top
5 楼zhang_jiang(Solar)回复于 2005-05-14 10:42:03 得分 0
加快收敛速度的牛顿下山法:
f(int x0)
{
int r;
int x, x1;
x1=x=x0;
do
{
r=1.0;
x1 = x - (x*x*x-3*x-1)/(3*x*x-3);
while(fabs(x*x*x-3*x-1)>fabs(x1*x1*x1-3*x1-1))
{
r/=2.0;
x1 = x - r*(x*x*x-3*x-1)/(3*x*x-3);
}
}while(fabs(x-x1)<1.0e-8);
}
另: 上面牛顿法中的while(abs(...)<1.0e-8) -> while(fabs(...)<1.0e-8)Top
6 楼cuixiping(无心●愚公)回复于 2005-05-14 12:47:35 得分 0
干嘛那么复杂?高中不是有学过一元三次方程的根是有公式的吗?直接用公式可以了。Top
7 楼charlen(Cccc.......)回复于 2005-05-14 16:45:50 得分 0
谢谢各位的指点~
但有没有人能用快速弦截法编写一下啊~
谢谢Top
8 楼zhang_jiang(Solar)回复于 2005-05-15 13:54:40 得分 0
弦截法:
同牛顿迭代法一样, 使用x_(k+1)=x_k-f(x_k)/(f'(x_k))
但是求f'(x_k)的时候用差商来求. 即f'(x_k)=(f(x_k)-f(x_(k-1)))/(x_k-x_(k-1))Top




