【问题标题】:What's wrong with this code for solving integral equations in python这段代码在python中求解积分方程有什么问题
【发布时间】:2013-11-05 01:18:45
【问题描述】:

我有以下积分方程:

我正在尝试求解积分方程以查看 f(u) 是否被预测为 cos(2u)。因为我们知道积分方程的解是 cos(2u),所以我们可以将积分从 0 到无穷大逼近到极限 0,也就是说,如果我们使从 5 到无穷大的积分值可以忽略不计,则可以说 5,这可以通过选择小来完成。我为 0 到 5 之间的积分选择了 100 个评估点,这意味着我正在求解 100 个 f(u) 值。由于我需要求解 100 个 f(u) 值,因此我需要生成 100 个方程,因此需要 100 个时间 t 值。我在 1 到 1.3 之间为时间 t 选择 100 个值,因为这将确保积分对于 5 及以上的值可以忽略不计。以下是执行此操作的 scipy 代码:

from scipy import*
from matplotlib.pyplot import*


Nt_samples=100  #100 evaluation points for the time t
t=linspace(1.0,1.3,100)
number_eval_points=100  #100 evaluation points for u 

eval_points=linspace(0.005,5,number_eval_points)
delta=eval_points[1]-eval_points[0]
R=zeros(100,1)
R=0.5*sqrt(2*3.14)*t*exp(-2*t*t)
A=zeros((Nt_samples,number_eval_points))    

for i in range(100):
    for j in range(100):
        A[i,j]=delta*exp(-(eval_points[j]*eval_points[j])/(2*(t[i]*t[i])))


Z=cos(2*eval_points)
Fu=dot(linalg.inv(A),R)
plot(eval_points,Fu,eval_points,Z)

不知何故,我对 f(u) 的结果与 cos(2u) 相去甚远。 事实上,它们看起来像很多随机噪声,根本不遵循任何模式!此外,f(u) 的大小非常大。我试过玩弄评估点的数量和 t 的值,但我没有运气。

参数/逻辑的代码/设置有什么问题吗?

谢谢一百万!

【问题讨论】:

  • 我不确定这是否是您的问题,但您知道3.14 != pi 吗?当我看到人们使用它时,我总是畏缩。我实际上花了一个星期调试为什么我写的一个程序没有给出与旧版本代码相同的输出,那是因为旧版本使用的是 3.14。你应该用math.pi替换它。
  • 另一个问题可能是 100 不够接近无穷大。您是否尝试过 1000 或 10000 并查看图是否开始彼此相似?
  • @SethMorton:10000 或 10000 点也没有运气:(

标签: python scipy integration equation


【解决方案1】:

这不是一个编程问题,但这里有一点:积分方程通常在数值上是不良条件的。

确实,就你而言,

u, s, vh = linalg.svd(A)
print(s.max()/s.min())
# -> 4.03758642411e+16

这是条件数,很大。矩阵A几乎是奇异的,所以解会有很大的误差。

谷歌搜索“Tikhonov 正则化”应该让您了解人们如何解决此类问题。求解积分方程是数学中的一个成熟领域,因此在这里谷歌搜索应该会对您有很大帮助。

快速正则化正在将linalg.inv(A) 替换为

linalg.pinv(A, 1e-8)
这给出了更余弦的外观。神奇的值1e-8 取决于积分内核,但是当事情是关于舍入误差时,可以尝试的好值大约是sqrt(finfo(float).eps),这意味着您信任浮点数所具有的~15 位数字的一半。

此外,更改变量可能比截断u[0, 5] 的范围更好。您的情况下的数值问题可能与权重因子呈指数下降有关,因此通过改变变量来消除它也可能使条件数更好。

【讨论】:

  • 感谢您的信息!这个值看起来很像 cos(2u)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2018-09-09
相关资源
最近更新 更多