(我不确定是否应该在本网站或数学网站上发布此问题。如有必要,请随时迁移此帖子。)
我的问题在于,给定值k
我想在k
中数值计算非线性多项式的有理函数,如下所示:(抱歉,我不喜欢&# 39;知道如何在这里排版方程式......)
其中{a_0, ..., a_N; b_0, ..., b_N}
是复数常量,{u_0, ..., u_N, v_0, ..., v_N}
是实常数,i
是虚数。我从 Numerical Recipes 中学到了很多方法可以快速计算多项式,同时保持舍入误差足够小,如果所有系数都是常数的话。但我不认为这些想法在我的案例中是有用的,因为指数前因也取决于k
。
目前我在C中使用complex.h
以蛮力的方式计算它(这只是一个伪代码):
double complex function(double k)
{
return (a_0+a_1*cexp(I*u_1*k)*k+a_2*cexp(I*u_2*k)*k*k+...)/(b_0+b_1*cexp(I*v_1*k)*k+v_2*cexp(I*v_2*k)*k*k+...);
}
然而,当function
的调用次数增加时(因为这只是我实际计算的一部分),它非常慢且不准确(只有6个有效数字)。我感谢任何意见和/或建议。
答案 0 :(得分:0)
我相信这不是家庭作业! 通常的技巧是使用循环将下一个系数添加到运行总和,然后乘以 k 。但是,在您的情况下,我认为系数中的“ e ”项将通过分解k来压倒任何节省。你仍然可以做到,但节省的费用可能很小。
u_i是不变的吗?根据您运行此公式需要多少次,也许您可以预乘u_i * k(除非k改变每次运行)。自从我参加数值分析课程以来,已经有这么多年了,我对这个行业的技巧只有模糊的回忆。让我们看看...... e ^(i * u_i * k)与(e ^(i * u_i))^ k相同吗?我不记得关于虚数的规则,或者你是否会保存任何东西,因为你有一个真实的(假设k是真的)无论如何(内部使用e ^ power完成)。
如果你只得到6位数,那表明你的数学,也许是你的库,正在以单精度(32位)实数工作。检查你的库并检查你所使用的声明至少是双精度(64位)实数。