牛顿的方法对于某些多项式是发散的
Newton's method is divergent for some polynomials
我已经尝试实现多项式的牛顿方法。类似:
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++;
}
其中CCD_ 1计算函数的值并且CCD_。
作为x0
,我使用了起点M
,这是我利用Sturm定理找到的。
我的问题是,这种方法对于像x^4+2x^3+2x^2+2x+1
这样的多项式是发散的。也许它不是正则的,但我注意到,当方程的解是负数时,就会发生这种情况。我在哪里可以找到解释?
编辑:dg
double result=0;
for(int i=0; i<n+1; i++)
result+=w[i]*(n-i)*pow(x, n-i-1);
其中n是多项式的次数
我不知道你为什么会说它是发散的。
我实现了与你类似的牛顿方法:
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
接近。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 在 NTL 中构造多项式的标准方法是什么?
- 用霍纳方法进行多项式求值的C++ constexpr
- 在C++中评估基于矩阵的多项式的最佳方法
- 牛顿的方法对于某些多项式是发散的
- C++ 使用霍纳方法计算多项式的递归帮助
- 特征多项式的Souriau方法
- 求多项式特定值的最快方法