牛顿下山法求解根式

数值计算课程老师讲了牛顿下山法。在根附近,从y曲线任取一点。得到(x0, y0)。然后从这一点作切线。这是一条直线。求出它和x轴的交点(x1, 0)。从y曲线取x1处的一点,得到(x1, y1) 。这是比原更接近于根(x*,0)的值。把(x1, y1)用作(x0, y0)如此得到迭代,获得序列(xi, yi)。越到后面的xi越接近x*, yi越接近0。

由此推导出一个迭代计算公式:

x[i+1]= (0-y[i])/y'[i] + x[i]

如果是求根号2,y的函数是

y = x * x -2

代入后,得到迭代公式:

x = (x/2 + 2/(2x))

写成程序就是:

for(i=0; i<10; i++) {
    
    
        x = x/2 +1/x;
        print x;
}

此后就死记硬背记住了它,每次遇到就查书,照抄这个公式,照抄这段代码。相信有很多人,都和我一样吧!

现在丢掉这个教条,重新来看,就是求一个x[i], y[i], k[i]的序列嘛!那就一个一个算好了。

x=1.0; y=-1.0;
for(i=0; i<10; i++) {
    
    
        k = 2*x;
        x = -y/k +x;
        print x;
        y = x*x -2;
}

在这个for循环里,输入的x, y, k,自然就是x[i], y[i], k[i], 新算到的x,y,k, 就是x[i+1], y[i+1], k[i+1]。由于i的控制,就把下标省略了。其实一点也不难。不用死背书了。

运行结果如下:

1.500000
1.416667
1.414216
1.414214
1.414214
1.414214
1.414214
1.414214
1.414214
1.414214

猜你喜欢

转载自blog.csdn.net/aaasssdddd96/article/details/108767357