gpt4 book ai didi

c++ - Durand-Kerner 方法求非线性方程的根

转载 作者:行者123 更新时间:2023-11-30 01:50:27 28 4
gpt4 key购买 nike

有人要求我求 f(x) = 5x(e^-mod(x))cos(x) + 1 的根。我以前使用 Durand-Kerner 方法求函数 x^4 -3x^3 + x^2 + x + 1 的根,代码如下所示。我以为我可以简单地重用代码来找到 f(x) 的根,但是每当我用 f(x) 替换 x^4 -3x^3 + x^2 + x + 1 时,程序输出所 Root过的 nan 。我的 Durand-Kerner 实现有什么问题,我该如何修改它以使其适用于 f(x)?如果有任何帮助,我将不胜感激。

#include <iostream>
#include <complex>
#include <math.h>

using namespace std;

typedef complex<double> dcmplx;

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

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 = 100;
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-q)*(p0-r)*(p0-s));
q = q0 - f(q0)/((q0-p)*(q0-r)*(q0-s));
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;
}

到目前为止我唯一改变的是 dcmplx f 函数。我一直在把它改成

dcmplx f(dcmplx x)
{
// the function we are interested in
double a4 = 5;

double a0 = 1;

return (a4 * x * exp(-x) * cos(x) )+ a0;
}

最佳答案

您使用的 Durand-Kerner 方法要求函数在您工作的时间间隔内连续。

这里我们发现了数学观点和数值应用的限制之间的差异。我建议你绘制你的函数(在谷歌中输入公式会给你一个快速概览,当然是真实的部分)。你会注意到:

  • 由于余弦的周期性,存在无穷根。
  • 由于 x*exp(-x) 的原因,绝对值会迅速上升,超出 float 可以容纳的最大精度。

为了了解对您的代码的影响,我邀请您跟踪不同的迭代。您会注意到 p、r 和 s 收敛得非常快,而 q 发散(显然在其中一个巨大的峰的轨道上):

  • 在第 2 次迭代时 q 已经是 1e74
  • 在第 3 次迭代时,已经超出了 double 可以存储的范围。
  • 由于 q 用于计算 p、r 和 s,误差会传播到其他项
  • 在第 5 次迭代时,所有项都为 NAN
  • 然后勇敢地继续进行 100 次迭代

也许您可以通过选择不同的起点来使其发挥作用。如果没有,您将不得不使用其他方法并仔细选择您正在处理的中间墙。

关于c++ - Durand-Kerner 方法求非线性方程的根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469376/

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