我试图用多项式实现牛顿方法。像:
double xn=x0;
double gxn=g(w, n, xn);
int i=0;
while(abs(gxn)>e && i<100){
xn=xn-(gxn/dg(w, n, xn));
gxn=g(w, n, xn);
i++;
}
其中g(w, n, xn)
计算函数的值,dg(w, n, xn)
计算导数。
作为x0
,我使用了我用Sturm定理找到的起点M
。
我的问题是这种方法对于x^4+2x^3+2x^2+2x+1
等一些多项式是不同的。也许它不规律,但我注意到当方程的解为负数时会发生这种情况。我在哪里可以寻找解释?
编辑: 分克
double result=0;
for(int i=0; i<n+1; i++)
result+=w[i]*(n-i)*pow(x, n-i-1);
其中n是多项式的次数
答案 0 :(得分:2)
我不确定你为什么会说它有分歧。
我实施了类似于你的牛顿方法:
double g(int w[], int n, double x) {
double result = 0;
for (int i = 0; i < n + 1; i++)
result += w[i] * pow(x, n - i);
return result;
}
double dg_dx(int w[], int n, double x) {
double result = 0;
for (int i = 0; i < n ; i++)
result += w[i] * (n - i) * pow(x, n - i - 1);
return result;
}
int main() {
double xn = 0; // Choose initial value. I chose 0.
double gx;
double dg_dx_x;
int w[] = { 1, 2, 2, 2, 1 };
int i = 0;
int n = 4;
do {
gx = g(w, n, xn);
dg_dx_x = dg_dx(w, n, xn);
xn = xn - (gx / dg_dx_x);
i++;
} while (abs(gx) > 10e-5 && i < 100);
std::cout << xn << '\n';
}
它产生-0.997576
,接近解-1
。