给你一点提示。
牛顿迭代法要计算
(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.
用牛顿迭代法求方程 x*x*x-2*x*x-5*x+6=0在0附近的实根.程序如下:
#include
#include
float f(float x)
{
return (x*x*x-2*x*x-5*x+6);
}
float f1(float x)
{
return (3*x*x-4*x-5);
}
void main()
{
float x1=0,x;
clrscr();
do
{
x=x1;
x1=x-f(x)/f1(x);
}while(fabs(x1-x)>0.0001);
printf("x=%f\n",x1);
}
运行程序前,请先确认:
该方程所对应的曲线在给定区间单调
该方程在给定区间有唯一
这两点好似是必须给出的吧
牛顿迭代法,你得知道它的导数的表达式。
如果是普通的函数,那么这就复杂了。
如果是多项式,那会好一些,因为多项式的一阶导还好弄。。。。
http://zhidao.baidu.com/question/39397721.html
#include
#include
typedef double (*Fun)(double);
double newtown(double x0, Fun f, Fun df) //牛顿法
{
double x1 = x0 - f(x0) / df(x0);
while(fabs(x0 - x1) > 1e-12)
{
x0 = x1;
x1 = x0 - f(x0) / df(x0);
}
return x1;
}