牛顿法求最小值c语言,用C语言编程 牛顿迭代法 计算f(x)=X27X+10的最优值?马上,用C语言编程求牛顿迭代法求方程f(x)=0的根。(...

匿名网友:

牛顿迭代法是一种常用的计算方法,这个大学大三应该学过。

具体为:设r是f(x) = 0的根,选取x0作为r初始近似值,过点x0,f(x0)做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。

过点x1,f(x1)做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。

重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n),称为r的n+1次近似值,上式称为牛顿迭代公式。

你把这段文字认真仔细慢慢读一遍,把给的方程式写出来,然后照这个在纸上画出图形,就会明白牛顿迭代法的概要了。

你讲的xopint?root?float?这些都是自己定义的函数。

float是c语言中定义浮点型变量的写法。

#include #include void main(){float f(float);float xpoint(float,float);float root(float,float);float x,x1,x2,f1,f2;do{printf"输入x1,x2\n\n";scanf("%f%f",&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>0);x=root(x1,x2);printf"方程在1.5附近的根为:%f\n\n",x;}float f(float x)//定义一个f函数,返回值y{float y;y=2*x*x*x-4*x*x+3*x-6;return(y);}float xpoint(float x1,float x2)//定义一个带返回值的函数即y,也就是求y的函数,main)中调用{float y;y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return(y);}float root(float x1,float x2)//这也是定义一个函数,是求根的函数,利用了上面自己定义的函数{float x,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>1e-4);return(x);} 建议你看看c 语言教程,上面讲得很详细噢。

匿名网友:

#include #include double root(double (*f)(double),double (*f1)(double), double x,double eps);double fx(double x){ return 2*x*x*x-4*x*x+3*x-6; }double fp(double x){return 6*x*x-8*x+3;}int main(){double x=1.5,y,eps=1e-08;printf("input eps 1e-08\n"); scanf("%lf",&eps);y = root(fx,fp,x,eps);printf("%lf\n",y);return 0;}double root(double (*f)(double x),double (*f1)(double x), double x,double eps){double x0,x1;x0=x;while(1){x1= x0 - (*f)(x0)/ (*f1)(x0);if (fabs(x1-x0)x0=x1;};return x1;}运行与输出:input eps 1e-081e-082.000000

匿名网友:

牛顿迭代法Newton's method又称为牛顿-拉夫逊方法Newton-Raphson method,它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。

多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。

方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。

牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。

另外该方法广泛用于计算机编程中。

设r是f(x) = 0的根,选取x0作为r初始近似值,过点x0,f(x0)做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。

过点x1,f(x1)做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。

重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n),称为r的n+1次近似值,上式称为牛顿迭代公式。

解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。

把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n)。

给你一点提示。

牛顿迭代法要计算 1 y1=f(x) 在 x 的函数值 2 d1=f(x) 的一阶导数 在 x 的值 你可以写两个函数,分别计算y1,d1 如果一阶导数有解析解,则可用赋值语句,否则要写数值解子程序。

步骤: 设解的精度,例 float eps=0.000001; 设x初值,x1; 算y1=f(x1); 迭代循环开始 算一阶导数 在 x1 的值 d1 用牛顿公式 算出 x2; x2 = x1 - y1 / d1 如果 fabs(x2-x1) > eps 则从新迭代 -- 用新的函数值和一阶导数值推下一个 新x. 牛顿迭代法: #include #include #include #define MAXREPT 1000 float f(float x) {return(x-exp(-x)); } float df(float x) {return(1+exp(-x)); } float iterate(float x) {float x1; x1=x-f(x)/df(x); return(x1); } void main() {float x0,x1,eps,d;int k=0; printf("\n please input x0,eps:"); scanf("%f,%f",&x0,&eps); printf("\n k xk\n"); printf(" %d %f\n",k,x0); do {k++; x1=iterate(x0); printf(" %d %f\n",k,x1); d=fabs(x1-x0); x0=x1; } while((d>=eps)&(k匿名网友:

程序流程分析: ① 赋值x0=1.5,即迭代初值; ② 用初值x0代入方程中计算此时的f(x0)及f'(x0),程序中用变量f描述方程的值,用fd描述方程求导之后的值; ③ 计算增量d=f/fd; ④ 计算下一个x,x=x0-d; ⑤ 把新产生的x替换x0,为下一次迭代做好准备; ⑥ 若d绝对值大于1e-3,则重复②③④⑤步。

源程序代码: #include main() { float x,x0,d,f,fd; x0=0; do { f=2*x0*x0*x0-4*x0*x0+3*x0-6; fd=6*x0*x0-8*x0+3; d=f/fd; x=x0-d; x0=x; }while(fabs(d)>1e-3); printf("x=%f\n",x); }

匿名网友:

用牛顿迭代法求方程2*(X-4)+3)X-6=0的根。

其迭代公式为X2=X1-F(X1)/F'(X1)F'(X1)为对方程求导。

本题中P'(X1)=(6*x1-8)*x1-3;编译显示正确,但一运行就死机,我已经死了3次了。

一开始还以为电脑的问题#include#includevoid main(void){float x1,x2=100;do{x1=x2;x2=(float)x1-(((2*x1-4)*x1+3)*x1-6)/((6*x1-8)*x1-3);}while(fabs(x2-x1)>pow(10,-5));cout}

匿名网友:

给你一点提示。

牛顿迭代法要计算(1) y1=f(x) 在 x 的函数值(2) d1=f(x) 的一阶导数 在 x 的值你可以写两个函数,分别计算y1,d1如果一阶导数有解析解,则可用赋值语句,否则要写数值解子程序。

步骤:设解的精度,例 float eps=0.000001;设x初值,x1;算y1=f(x1);迭代循环开始算一阶导数 在 x1 的值 d1用牛顿公式 算出 x2; x2 = x1 - y1 / d1如果 fabs(x2-x1) > eps 则从新迭代 -- 用新的函数值和一阶导数值推下一个 新x.

匿名网友:

牛顿迭代法牛顿迭代法又称牛顿切线法,它采用以下方法求根:先任意设定一个与真实的根接近的值x0作为第一个近似根,由x0求出f(x0),过x0,f(x0)点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),再过x1,f(x1)点做f(x)的切线,交x轴于x2,再求出f(x2),再作切线……如此继续下去,直到足够接近真正的x为止。

其中f'(X0)是函数在X0处的斜率,也就是在X0处的导数。

代码如下:#include#includefloat f(float a,float b,float c,float d,float x){float f;f=((a*x+b)*x+c)*x+d;return f;}float f1(float a,float b,float c,float x){float f;f=(x*3*a+2*b)*x+c;return f;}float root(float a,float b,float c,float d){float x0,x1=1;do{x0=x1;x1=x0-f(a,b,c,d,x0)/f1(a,b,c,x0);}while(fabs(x1-x0)>=1e-6);return x0;}void main(){float a,b,c,d,x;printf("input four float numbers:\n");scanf("%f%f%f%f",&a,&b,&c,&d);x=root(a,b,c,d);printf("%.1fX^3+%.1fX^2+%.1fX+%.1f=0 its root near x=1.5 is :%.4f\n",a,b,c,d,x);getch();}

问题推荐

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值