首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >牛顿收敛法

牛顿收敛法
EN

Stack Overflow用户
提问于 2018-05-14 18:18:04
回答 2查看 281关注 0票数 1

我试图用牛顿-拉夫森方法逼近多项式的根.我编写的代码如下所示:

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>

int main (){

double c, nq, nnq, nnnq, v, h, q, o;

o=2;
c=-0.55;
nq=-0.04625;
nnq=-0.55;
nnnq=1;

   while(fabs(c-v) > 0.000001)
   {
      nq=((2*(o-1)+1)*(c)*(nnq)-(o-1)*nnnq)/((o-1)+1);                                                     
      q=(-o*c*nq+o*nnq)/(1-(c*c));
      h=(c-(nq/q));
      printf("The better root is %.15lf\n",h);
      v=c;
      c=h;
   }

}

我知道没有必要写变量o,c,nq等,因为我可以使用它们的确切值。这是一个更大问题的一部分,我需要这些变量,所以忽略它。

这个程序输出如下:

代码语言:javascript
复制
The better root is -0.578030303030303
The better root is -0.591696792857493
The better root is -0.598609887802599
The better root is -0.602171714355970
The better root is -0.604024260228500
The better root is -0.604992519745332
The better root is -0.605499890229896
The better root is -0.605766110042157
The better root is -0.605905895095070
The better root is -0.605979319651017
The better root is -0.606017894664121
The better root is -0.606038162857992
The better root is -0.606048812800124
The better root is -0.606054408979837
The better root is -0.606057349623975
The better root is -0.606058894866533
The better root is -0.606059706860161

相反,它应该收敛到-0.57735026918963点。我知道牛顿-拉夫森肯定会收敛,所以错误应该在代码上。我还尝试使用printf来本地化问题,我认为问题出现在第二次迭代中。我认为程序无法正确计算nq,但我不知道为什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-22 09:48:39

不只是计算x = sqrt(1.0/3),您希望将Legendre多项式的递归计算合并到o级,可能是将该方法扩展到大于2的o值。

代码语言:javascript
复制
P(0,c) = 1; P(1,c) = c;
(n+1)*P(n+1,c) = (2*n+1)*c*P(n,c) - n*P(n-1,c),   n=1, ... , o-1

而导数可以计算为

代码语言:javascript
复制
(1-c^2)*P'(o,c) = -n*c*P(o,x) + n*P(o-1,c).

这个迭代你需要包括在牛顿循环,在理想的情况下使用一个对象的Legendre多项式与方法的值和导数。我已经修改了您的结构,以便在JavaScript中工作:

代码语言:javascript
复制
var my_div = document.getElementById("my_div");
var c = -0.55;
var v = -20;
var o = 2;
while( Math.abs(v-c) > 1e-12 ) {
    p0 = 1; 
    p1 = c;
    for(n=1; n<o; n++) {
        // p0, p1, p2 stand for P(n-1,c), P(n,c), P(n+1,c)
        p2 = ((2*n+1)*c*p1 - n*p0) / (n+1)
        p0 = p1; p1 = p2;
    }
    // p0, p1 now contain p(o-1,x), p(o,x)
    p1prime = ( -o*c*p1 + o*p0) / (1-c*c);
    h = c - p1/p1prime;
    my_div.innerHTML += "<p>The better root is "+h+"</p>";
    v = c; c = h;
 }
代码语言:javascript
复制
<div id="my_div"></div>

票数 1
EN

Stack Overflow用户

发布于 2018-05-14 18:58:50

这是求解方程的牛顿方法(这是一个快速的代码,不要检查变量名):

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>

int main ()
{    
    double s = 2.0, fx = 0, dfx = 0, p = 0;

    while(fabs(s - p) > 0.000001)
    {
        fx = 0.5 * (3 * s * s - 1);
        dfx = 3 * s;
        p = s;
        s = s - (fx / dfx);
        printf("The better root is %.15lf\n", s);
    }    
    return 0;
}

并收敛到0.577350269189626。您的问题是,您正在尝试同时计算两个递归。顺便问一下,在你的问题中,你说你要计算“多项式的根”。我不太明白你的意思。如果从根表示方程的平方根,则需要更新这段代码,并相应地更改fxdfx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50336636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档