如何获得积分的上限?
Posted
技术标签:
【中文标题】如何获得积分的上限?【英文标题】:How to get the upper limit of a integration? 【发布时间】:2021-08-02 02:30:20 【问题描述】:我有一个概率分布函数如下:
f = @(x) h0 * (1/sqrt(2*pi*sig2)) .* exp(-(x-mh0).^2 / (2*sig2))+ (1-h0) * (1/sqrt(2*pi*sig2)) .* exp(-(x-mh1).^2 / (2*sig2));
我正在做这个 Matlab。除了 x,一切都是不变的。
此函数的范围是 (-4 , 8)。我想将此区域划分为相等的质量,即 1/10(10 个间隔,每个间隔的质量为 1/10)。
我正在考虑整合它并检查上限以了解整合的结果。但是我没有找到方法来做到这一点? 谁能帮我解决这个问题? 提前致谢
【问题讨论】:
我建议使用 MATLAB 的标准 ODE 求解器对其进行数值积分。试试ode45
。如果分布函数太僵硬而无法集成,请尝试ode23
。无论 ODE 求解器返回积分的离散值,您都必须制作自己的逻辑结构来逼近相等的质量点。
【参考方案1】:
如果您不担心最终效率,简单的二等分搜索将很容易找到分裂点。例如,一分为二:
sig2 = rand;
mh0 = rand;
h0 = rand;
mh1 = rand;
f = @(x) h0 * (1/sqrt(2*pi*sig2)) .* exp(-(x-mh0).^2 / (2*sig2))+ (1-h0) * (1/sqrt(2*pi*sig2)) .* exp(-(x-mh1).^2 / (2*sig2));
l = -4;
u = 8;
fprintf('total integral = %e\n', quad(f, l, u));
l0 = l;
u0 = u;
while u0 - l0 > 0.0001
m = 0.5 * (l0 + u0);
w = quad(f, l, m);
if w > 0.5
u0 = m;
else
l0 = m;
end
end
m = 0.5 * (l0 + u0);
fprintf('integral to %e = %e\n', m, quad(f, l, m));
要拆分为 10 个部分,请对子部分进行递归。先在 0.5 处分割,然后在 0.2 处分割低区间,然后在 0.1 处分割低部分,在 0.3 处分割上部分,然后在 0.3/0.5 区间得到 0.4。上半部分也是如此。
【讨论】:
以上是关于如何获得积分的上限?的主要内容,如果未能解决你的问题,请参考以下文章