gpt4 book ai didi

c++ - 我的 durand-kerner 实现有什么问题?

转载 作者:行者123 更新时间:2023-11-28 03:05:14 28 4
gpt4 key购买 nike

实现这个简单的寻根算法。 http://en.wikipedia.org/wiki/Durand%E2%80%93Kerner_method我一生都无法弄清楚我的实现有什么问题。树根不断膨胀,没有收敛的迹象。有什么建议吗?

谢谢。

#include <iostream>
#include <complex>

using namespace std;

typedef complex<double> dcmplx;

dcmplx f(dcmplx x)
{
// the function we are interested in
double a4 = 3;
double a3 = -3;
double a2 = 1;
double a1 = 0;
double a0 = 100;

return a4 * pow(x,4) + a3 * pow(x,3) + a2 * pow(x,2) + a1 * x + a0;
}


int main()
{

dcmplx p(.9,2);
dcmplx q(.1, .5);
dcmplx r(.7,1);
dcmplx s(.3, .5);

dcmplx p0, q0, r0, s0;

int max_iterations = 20;
bool done = false;
int i=0;

while (i<max_iterations && done == false)
{
p0 = p;
q0 = q;
r0 = r;
s0 = s;


p = p0 - f(p0)/((p0-q0)*(p0-r0)*(p0-s0));
q = q0 - f(q0)/((q0-p)*(q0-r0)*(q0-s0));
r = r0 - f(r0)/((r0-p)*(r0-q)*(r0-s0));
s = s0 - f(s0)/((s0-p)*(s0-q)*(s0-r));

// if convergence within small epsilon, declare done
if (abs(p-p0)<1e-5 && abs(q-q0)<1e-5 && abs(r-r0)<1e-5 && abs(s-s0)<1e-5)
done = true;

i++;
}

cout<<"roots are :\n";
cout << p << "\n";
cout << q << "\n";
cout << r << "\n";
cout << s << "\n";
cout << "number steps taken: "<< i << endl;

return 0;
}

最佳答案

晚了半年:谜题的解是分母应该是多项式导数的近似值,因此需要包含首项系数a4作为因子。

或者,可以在 return 语句中将多项式值除以 a4,以便有效地对多项式进行范数,即具有前导系数 1。

请注意,维基百科中 Bo Jacoby 的示例代码是该方法的 Seidel 型变体,经典公式是 Jordan-like 方法,其中所有新近似值同时从旧近似值计算得出。 Seidel 可以比作为多维牛顿方法的公式为 Jacobi 提供的 2 阶收敛更快。

但是,对于较大的次数,可以使用快速多项式乘法算法来加速 Jacobi,以便对多项式值和分母中的乘积进行所需的多点评估。

关于c++ - 我的 durand-kerner 实现有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19886952/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com