- 要求输入a,b,c,d分别对应方程a*x^3+b*x^2+c*x+d=0;
- 求出方程在x=1.0附近的根
- 知识补充:牛顿迭代法:
假设一元函数为 f(x)=0 ,如果我们已经知道迭代的初值在方程的零点附近,则就可以用直线近似函数 f(x) , 求直线方程的零点。具体可以参考如下的函数图像:
假设一元函数为 f(x)=0 ,如果我们已经知道迭代的初值在方程的零点附近,则就可以用直线近似函数 f(x) , 求直线方程的零点。具体可以参考如下的函数图像:
函数 f(x) 按照一阶泰勒公式展开为:
f(x)≈f(xn)+f′(xn)(x−xn)
令上式右边等于零,得到:
x=xn−f(xn)f′(xn)
写成迭代格式为:
xn+1=xn−f(xn)f′(xn)
- 源代码如下
#include <stdio.h> #include<conio.h> #include <math.h> int main() { float x,x0,f,f1; int q = 0; x = 1.0; float a,b,c,d; printf("input a,b,c,d:"); //方程的系数 scanf("%f,%f,%f,%f",&a,&b,&c,&d); do { x0=x; f=a*x0*x0*x0+b*x0*x0+c*x0+d; //方程表达式 f1=3*a*x0*x0+2*b*x0+c; //一阶导数 x=x0-f/f1; q++; //迭代的次数 } while(fabs(x-x0)>=1e-10); //函数fabs:求浮点数x的绝对值 printf ("%f\n%d\n",x,q); getch(); return 0 ; }
希望我的分享对你有所启发