java牛顿法求方程根_C程序习题-用牛顿迭代法求方程的根[6.12]

本文介绍了如何使用牛顿迭代法求解方程2X3– 4X2+3X- 6 = 0在1.5附近的根。通过理解一阶导数函数的概念,作者编写了Java程序并详细阐述了算法原理。程序计算出的根为2,证明了算法的有效性。此外,文章还讨论了数学知识在编程中的重要性。
摘要由CSDN通过智能技术生成

用牛顿迭代法求下面方程在1.5附近的根。2X3– 4X2+3X- 6 = 0

看到这个题目,我便开始百度,看什么是牛顿迭代法。看了上面的解释,我还是一头雾水。无从下手。不知所云。看着上面写的推到公式,我更是不知道是什么意思。最后一个无意中,我看到了一个名词,一阶导数函数。我眼睛一亮。似乎有所感悟,这些都是上大学学的高等数学的东西。可现在也基本上还给了老师。我根据例题,慢慢的去猜测到如何去求一个函数的一阶导数函数。又比葫芦画瓢,将程序写出来一运行,欣慰的是,程序算出了正确答案,自己手动套入方程,结果就是我们要的结果。通过这个题,发现自己的数学知识实在是太差劲了。更认识到,老师的良苦用心,在我上大学的时候,我一直不明白,高等数学对计算机编程有什么好处。参加工作后,慢慢的我认识到了数学对一个编程人员的重要性。

这个网页是在百度上对牛顿迭代的介绍。

这个页面是我看到的一个网友对牛顿迭代算法的推导过程,看完之后我真的是佩服,pangding网友的数学功底是如此之好。我要向他学习。因为我也是比葫芦画瓢,才将程序写出来的,其原理是:

(1) 选一个方程的近似根,赋给变量x1;

(2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;

(3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。

若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。

根据上面的原理编写代码:

#include

#include

double F1(double); //原函数

double F2(double); //原函数的一阶导数函数

double Newton(double,double);

int main(int argc, int *argv[])

{

double x0 = 1.5;

double e = pow(10,-5);

printf("the result is %f\n",Newton(x0,e));

system("pause");

}

double F1(double x)

{

return 2 * x * x * x - 4 * x * x + 3 * x - 6 ;

}

double F2(double x)

{

return 6 * x * x - 8 * x + 3 ;

}

double Newton(double x0, double e)

{

double x1;

do

{

x1 = x0;

x0 = x1 - F1(x1) / F2(x1);

}while (fabs(x1 - x0) > e);

return x0;

}

经程序计算,可以求根为:2

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

以下是pangding网友对牛顿迭代法的分析过程。

其实牛顿迭代法就是一利用不动点求方程根的方法之一。

如果你想求一个数,比如a的平方根。

相当于解方程:x^2 = a,或者 x^2 - a = 0。

如果你学过数学分析,应该知道左边可以在一个初值x0附近按泰勒级数展开:

x0^2 + 2(x-x0) * x0 + (x-x0)^2 - a = 0

取x的线性部分,就得到了一个近似方程:

x0^2 + 2(x-x0) * x0  - a = 0

可以从中解出x:

x = (a + x0^2) / (2 * x0)

如果你取的x0正好是a的平方根,那么代入上式,算出来的x还是a的平方根。

如果代入的不是a的平方根,那么算出来的x将比x0更接近a的平方根。

你可以设x0 = a' + d(其中a'表示a的平方根),代入:

于是x - a'

= (a + (a'+d)^2) / (2a' + 2d)   - a'

= (2a + 2a'd + d^2) / 2a' + 2d  - a'

< (2a + 2a'd + d^2) / 2a'       - a'

< (2a + 2a'd) / 2a'             - a'

= a' + d                        - a'

= d

可见 x 与 a' 的误差是比原来的x0要小的。

这样用新算出来的x做为x0的话,再代入那个式子,就可以算出更接近a'的数来。

理论上如果能无限代下去,最后就会得到a'的精确值。实际上只用迭代几次,就能得出与a'误差不太大的值。可以做为方程的近似解。

牛顿迭代法是一类解方程根的通法,虽然它也不是在任何情况下都能收敛到方程的根上。但一般情况下都可以以很快的速度逼近方程的根,因此这种方法使用的非常广泛。我这里只是就这道题推了一下公式,你上网查查应该有全面讲解 牛顿迭代法 的地方。在数学分析里这个方法又叫 牛顿切线法。它除了可以用泰勒公式推导以外(这是一种普遍的方法,除了可以推导牛顿迭代公式以外,还可以推导出更高阶的逼近公式。在数值分析中有专门的研究),还可以用几何方法推导这个公式。

它的一般形式是:

x = x0 - f(x0) / f'(x0)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值