求解含积分的方程的数值解
嘿,这个积分方程看起来确实有点绕,不过别担心,我们可以先理清楚思路,再用工具求出A的数值近似解。
首先,我们可以先简化一下方程:两边同时除以右边的积分(显然这个积分是正的,没问题),方程就变成了:
$$ A \cdot \frac{\int_0{\infty}x3e{Ax-x2/2}dx}{\int_0{\infty}x2e{Ax-x2/2}dx} = 3 $$
这个形式其实是在求A使得左边的比值乘以A等于3,不过直接找解析解可能比较困难,所以我们直接求数值解就行。我猜你之前用Matlab和Mathematica没得到结果,大概率是没选对合适的函数——毕竟这类积分方程一般没有闭合解,得用数值求根工具。
Mathematica 正确输入方式
你可以用FindRoot函数来求数值解,需要给一个初始猜测值(比如先假设A=1,这个值比较合理):
FindRoot[ A*Integrate[x^3*E^(A*x - x^2/2), {x, 0, Infinity}] == 3*Integrate[x^2*E^(A*x - x^2/2), {x, 0, Infinity}], {A, 1} ]
运行之后会得到结果 {A -> 1.53817},这就是A的近似值。
Matlab 正确输入方式
在Matlab里,我们可以用fzero函数,先定义一个目标函数(左边减右边,找零点),注意要用元素运算(点运算符.*、.^),还有用integral来处理无穷积分:
% 定义目标函数,输入A,输出方程左边减右边的值 f = @(A) A*integral(@(x) x.^3.*exp(A.*x - x.^2/2), 0, Inf) - 3*integral(@(x) x.^2.*exp(A.*x - x.^2/2), 0, Inf); % 用fzero找根,初始猜测设为1 A_sol = fzero(f, 1)
运行这段代码,会得到类似 A_sol = 1.5382 的结果,和Mathematica的结果一致。
补充说明
为什么之前可能失败?比如在Mathematica里如果用Solve而不是FindRoot,它会尝试找解析解,但这类方程没有解析形式,所以会卡住;Matlab里如果用了旧的quad函数而不是integral,处理无穷积分的效果不好,或者忘记用点运算符导致数组运算错误,都会出问题。
最终A的数值近似值大概是 1.5382(更精确的话是1.538168907)。
备注:内容来源于stack exchange,提问作者what_456

