我有以下积分方程:
我正在尝试解决积分方程,看看f(u)是否被预测为cos(2u)。因为我们知道积分方程的解是cos(2u),所以我们可以将积分从0到无穷大逼近0到0,如果我们使积分值从5到无穷大可忽略不计,这可以通过选择t来做小。我已经为0到5之间的积分选择了100个评估点,这意味着我正在求解f(u)的100个值。由于我需要求解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的值,但我没有运气。
参数/逻辑的代码/设置有什么问题吗?
万分感谢!
答案 0 :(得分:7)
这不是一个编程问题,但这里是:积分方程在数值上经常受到严格限制。
的确,在你的情况下,
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]
的范围更好。在你的情况下,数字问题可能与指数减少的权重因子有关,因此通过改变变量来摆脱它也可能使条件数更好。