我正在编写一个程序,用c ++查找n阶Legendre多项式的根;我的代码附在下面:
double* legRoots(int n)
{
double myRoots[n];
double x, dx, Pi = atan2(1,1)*4;
int iters = 0;
double tolerance = 1e-20;
double error = 10*tolerance;
int maxIterations = 1000;
for(int i = 1; i<=n; i++)
{
x = cos(Pi*(i-.25)/(n+.5));
do
{
dx -= legDir(n,x)/legDif(n,x);
x += dx;
iters += 1;
error = abs(dx);
} while (error>tolerance && iters<maxIterations);
myRoots[i-1] = x;
}
return myRoots;
}
假设存在功能的勒让德多项式和勒让德多项式导数生成函数,我确实有这些函数,但我认为这将导致代码文本难以理解。这个函数在它返回数组计算值的意义上起作用,但是它们非常关闭,输出以下内容:
3.95253e-323
6.94492e-310
6.95268e-310
6.42285e-323
4.94066e-323
2.07355e-317
我用Python编写的等效函数给出了以下内容:
[-0.90617985 -0.54064082 0. 0.54064082 0.90617985]
我希望另一双眼睛可以帮助我看看我的C ++代码中的问题是什么导致值大幅下降。我在Python代码中没有做任何与C ++不同的事情,所以任何人都可以给予的任何帮助都非常感谢,谢谢。作为参考,我主要试图模仿Rosetta代码中关于高斯求积法的方法:http://rosettacode.org/wiki/Numerical_integration/Gauss-Legendre_Quadrature。
答案 0 :(得分:1)
您正在将地址返回到堆栈中的临时变量
{
double myRoots[n];
...
return myRoots; // Not a safe thing to do
}
我建议将功能定义更改为
void legRoots(int n, double *myRoots)
省略return语句,并在调用函数
之前定义myrootsdouble myRoots[10];
legRoots(10, myRoots);
选项2是使用new或malloc动态分配myRoots。