2

(我不确定我是否应该在这个网站或数学网站上发布这个问题。如有必要,请随时迁移此帖子。)

我手头的问题是,给定一个值,k我想用数值计算非线性多项式的有理函数,k如下所示:(对不起,我不知道如何在这里排版方程......)复数常数 在哪里{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 个有效数字)。我感谢任何意见和/或建议。

4

1 回答 1

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 位)实数的声明。

于 2013-09-19T23:16:42.233 回答