一道关于数值计算牛顿迭代法的c语言编程题

lin1326zhang 2007-12-06 11:19:28
题目
用牛顿跌代法编c语言程序算法如下:
二、牛顿迭代法

算法描述:

给定初值x0, ε为根的容许误差,δ为|f(x)|的容许误差,N为迭代次数容许值。

1)如果f¹(x0)=0或迭代次数大于N,则算法失败,结束;否则执行2)

2)计算x1=x0-f(x0)/ f¹(x0)

3)若|x1-x0|<ε或|f(x1)|<δ,则输出x1,程序结束;否则执行4)

4) 令x0=x1,转向1)

程序如下:
x0取1.5
#include <stdio.h>
#include <math.h>
#define N 200
#define eps 1e-6
#define eta 1e-8
double df1(double x)
{return 2*x-exp(x);}
double df2(double x)
{return (exp(x)+x*exp(x));}
double df3(double x)
{return 1.0/(x*log(10));}
double f1(double x)
{return x*x-exp(x);}
double f2(double x)
{return x*exp(x)-1;}
double f3(double x)
{return log10(x)+x-2.0;}
double newton(double(*f)(double),double(*df)(double),double x0)
{
double x1;
int k=0;
while(1)
{
if((*df)(x0)==0||k++>N)
{printf("error\n"); return 0;}
x1=x0-(*f)(x0)/(*df)(x0);
if(fabs(x1-x0)<eps||fabs((*f)(x1))<eta)
return x1;
else x0=x1;
}
}

main()
{
double x0,y0[3];
int i;
double temp;
clrscr();
printf("plese input initial x0:\n");
scanf("%lf",&x0);
printf("x0=%f\n",x0);
temp=x0;
y0[0]=newton(f1,df1,x0);
x0=temp;
y0[1]=newton(f2,df2,x0);
x0=temp;
y0[2]=newton(f3,df3,x0);
for(i=0;i<3;i++)
printf("y0[%d]=%lf\n",i,y0[i]);
}
但是结果总是有问题,请大家帮帮忙

...全文
1159 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hai040 2007-12-06
  • 打赏
  • 举报
回复
不需要用temp保存x0,函数是按值调用的
double为0不能用==0判断,只能是取绝对值小于误差就算是0
pptor 2007-12-06
  • 打赏
  • 举报
回复
if((*df)(x0)==0 | ¦k++> N)改成 if((*df)(x0)==0 || ¦k++> N)
if(fabs(x1-x0) <eps | ¦fabs((*f)(x1)) <eta)改成if(fabs(x1-x0) <eps ||¦fabs((*f)(x1)) <eta)
粗心啊写错了

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧