首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++IsaacNewton法(Newton's Method)

2012-08-15 
C++牛顿法(Newtons Method)在用牛顿法的情况下,你的编程应该输出近似根和它的多样性。为了确定得到多样性

C++牛顿法(Newton's Method)
在用牛顿法的情况下,你的编程应该输出近似根和它的多样性。
为了确定得到多样性的根,当评估这个根时,应该先检查有多少p(x)的导数大约是0,(用同一个level的精确度,?=10^-10,for this check as well.)。
测试你的编程:
p(x)= -x^4 + 5x^3, [a,b]=[-1,3]
和p(x)= x^2 -3x +2,[a,b]=[1,5]

可以用简单易懂点的方法不,谢谢啦!

[解决办法]
仅供参考

C/C++ code
//用C语言编程,求出2^x=x^10这个方程的解。 
#include <math.h>
#include <stdio.h>
double x,e;
void main () {
  x=-1.0;
  e=0.001;
  while (1) {
    while (1) {
      if (pow(2.0,x) <pow(x,10.0)) {
        x+=e;
      } else {
        break;
      }
    }
    e/=10.0;
    if (e <1e-15) break;
    while (1) {
      if (pow(2.0,x)>pow(x,10.0)) {
        x-=e;
      } else {
        break;
      }
    }
    e/=10.0;
    if (e <1e-15) break;
  }
  printf("%+.14g\n",x);

  x=1.0;
  e=0.001;
  while (1) {
    while (1) {
      if (pow(2.0,x)>pow(x,10.0)) {
        x+=e;
      } else {
        break;
      }
    }
    e/=10.0;
    if (e <1e-15) break;
    while (1) {
      if (pow(2.0,x) <pow(x,10.0)) {
        x-=e;
      } else {
        break;
      }
    }
    e/=10.0;
    if (e <1e-15) break;
  }
  printf("%+.14g\n",x);
}


[解决办法]
探讨

根据牛顿法即是求迭代的过程
p(x)=-x^4+5x^3 求导可得: p'(x)=-4x^3+15x^2
再根据迭代公式 x(n+1) = x(n) - f(x(n))/f'(x(n))依次求近似解
取x0= (-1+3)/2 =1
p'(1) = -4+15 = 9
x1=x0-p(x0)/p'(x0)= 0.6363636363634
x2=x1-p(x1)/p'(x1)= …………

[解决办法]
找到个资料,大家先研究下:
/* 牛顿法解多项式的根
输入:多项式系数c[],多项式度数n,求在[a,b]间的根
输出:根
要求保证[a,b]间有根
*/

double fabs( double x )
{
return (x<0)? -x : x;
}

double f(int m, double c[], double x)
{
int i;
double p = c[m];

for (i=m; i>0; i--)
p = p*x + c[i-1];
return p;
}

int newton(double x0, double *r, 
double c[], double cp[], int n, 
double a, double b, double eps)
{
int MAX_ITERATION = 1000;
int i = 1;
double x1, x2, fp, eps2 = eps/10.0;

x1 = x0;
while (i < MAX_ITERATION) {
x2 = f(n, c, x1);
fp = f(n-1, cp, x1);
if ((fabs(fp)<0.000000001) && (fabs(x2)>1.0))
return 0;
x2 = x1 - x2/fp;
if (fabs(x1-x2)<eps2) {
if (x2<a || x2>b)
return 0;
*r = x2;
return 1;
}
x1 = x2;
i++;
}
return 0;
}

double Polynomial_Root(double c[], int n, double a, double b, double eps)
{
double *cp;
int i;
double root;

cp = (double *)calloc(n, sizeof(double));
for (i=n-1; i>=0; i--) {
cp[i] = (i+1)*c[i+1];
}
if (a>b) {
root = a; a = b; b = root;
}
if ((!newton(a, &root, c, cp, n, a, b, eps)) && 


(!newton(b, &root, c, cp, n, a, b, eps)))
newton((a+b)*0.5, &root, c, cp, n, a, b, eps);
free(cp);
if (fabs(root)<eps)
return fabs(root);
else
return root;
}

热点排行