读书人

求教高手牛顿迭代法有关问题

发布时间: 2012-02-29 16:44:11 作者: rapoo

求教高手牛顿迭代法问题
请教一下怎样用牛顿迭代法解一条直线和一条曲线的交点问题啊?
直线方程是:ax+by+c=0
曲线方程是:ax^2+bxy+cy^2+dx+ey+f=0
初值是a

[解决办法]
牛顿迭代法:

用牛顿迭代法求f(x)=0在x0附近的一个实根的方法是
(1) 选一个接近于x的真实根的近似根x1;
(2) 通过x1求出f(x1)。在几何上就是作x=x1,交f(x)于f(x1);
(3) 过f(x1)作f(x)的切线,交x轴于x2。可以用公式求出x2。由于f '(x1)=f(x1)/(x2-x1),故x2=x1-f(x1)/f '(x1)
(4) 通过x2求出f(x2);
(5) 再过f(x2)作f(x)的切线交x轴于x2;
(6) 再通过x3求出f(x3),…一直求下去,直到接近真正的根。当两次求出的根之差|xn+1-xn|≤ε就认为 xn+1足够接近于真实根。

牛顿迭代公式是:xn+1=xn-f(xn)/f '(xn)
[解决办法]
根据LZ的函数, 我随便编了一下. LZ自己根据自己的需求修改吧.

#include <iostream>
#include <cmath>

using namespace std;

double a=1.0, b=2.0,c=-3.0,d=4.0,e=5.0,f=-6.0;

void myFunction(double const x[2], double foo[2])
{
foo[0] = a*x[0]+b*x[1]+c;
foo[1] = a*x[0]*x[0] + b*x[0]*x[1] + c*x[1]*x[1] + d*x[0] + e*x[1] + f;

//cout < < foo[0] < < " " < < foo[1] < < endl;

}

void myJacobian(double const x[2], double jac[2][2])
{
jac[0][0] = a;
jac[0][1] = b;
jac[1][0] = 2.0*a*x[0]+b*x[1]+d;
jac[1][1] = b*x[0]+2.0*c*x[1]+e;
}

void main()
{
double tol = 1.e-8;
double x[2];
double fun[2];
double jac[2][2];
x[0] = 2.0;
x[1] = 1.0;

myFunction(x, fun);
while(fabs(fun[0])> tol || fabs(fun[1])> tol) {
myJacobian(x, jac);
double det = jac[0][0]*jac[1][1]-jac[0][1]*jac[1][0];
double dx = (fun[0]*jac[1][1]-fun[1]*jac[0][1])/det;
double dy = (jac[0][0]*fun[1]-jac[1][0]*fun[0])/det;
x[0] -= dx;
x[1] -= dy;
myFunction(x, fun);
}
cout < < "root: { " < < x[0] < < ", " < < x[1] < < "} " < < endl;
cout < < "check: { " < < fun[0] < < ", " < < fun[1] < < "} " < < endl;

}

读书人网 >C语言

热点推荐