数值积分函数

Posted

技术标签:

【中文标题】数值积分函数【英文标题】:Numerically integrate the function 【发布时间】:2021-12-13 23:36:02 【问题描述】:

我在matlab中有以下代码:

gamma=1.01;
[t,phi] = ode45(@(t,x)(gamma-F(x,pi/6, 0.5)), [0,100], 0);
plot(t,phi)
hold off; 
title('\gamma = 1.01')
function out = F(p, a, b)
phi = mod(p,2*pi);
out = (0      <= phi & phi < a     ).*(phi/a) ...
    + (a      <= phi & phi < pi/2  ).*((phi*(b-1)/((pi/2)-a))-(a*(b-1))/((pi/2)-a)+1)...
    + (pi/2   <= phi & phi < pi-a  ).*((phi*(1-b)/((pi/2)-a))-((pi-a)*(1-b))/((pi/2)-a)+1)...
    + (pi-a   <= phi & phi < pi+a  ).*(-phi/a + pi/a)...
    + (pi+a   <= phi & phi < 3*(pi/2)).*((phi*(1-b)/((pi/2)-a))-(((pi+a)*(1-b))/((pi/2)-a))-1)...
    + (3*pi/2 <= phi & phi < 2*pi-a).*((phi*(b-1)/((pi/2)-a))-(((2*pi-a)*(b-1))/((pi/2)-a))-1)...
    + (2*pi-a <= phi & phi < 2*pi  ).*(phi/a-2*pi/a);
end

我有一个问题。能否请您说一下如何在 MATLAB 中对这个函数进行数值积分(我想是这样称呼的)?

所以从这个 得到这个

【问题讨论】:

【参考方案1】:

对于数值积分,您可能应该使用简单的trapz:https://www.mathworks.com/help/matlab/ref/trapz.html。你也可以使用integralhttps://www.mathworks.com/help/matlab/ref/integral.html。

因此,对于您的代码,您需要简单

area=trapz(t,phi);

这是函数的整体积分 - 曲线下方的总面积。如果你想展示积分是如何随着t 增长的,你需要使用cumtrapz 进行累积积分的函数:

area = cumtrapz(t,phi);
plot(t, area)
% This is essentially equivalent to doing `trapz` in a loop with less hassle (for... area(i)=trapz(t(1:i),phi(1:i));...)

但是,您的红线不显示积分(积分将是红线或蓝线下方的区域)。似乎您想在几个点上近似函数,并将这些点连接起来?为此,您可以尝试搜索具有二阶导数的局部最大值/最小值的点,这些点应该对应于所需的点。

要获得导数,请使用diff:https://www.mathworks.com/help/matlab/ref/diff.html

所以

der1 = diff(phi);
der2 = diff(der1);
isLocalMax = (der2(2:end-1) > der2(1:end-2)) & (der2(2:end-1) > der2(3:end));
isLocalMin % equivalent...
plot(t(isLocalMax|isLocalMin), phi(isLocalMax|isLocalMin))

【讨论】:

@ZiziArcher 非常感谢!我想用trapz 询问你的情况。我将它添加到代码中,但情节是一样的。我应该改变其他东西吗? @Jane Integral 由trapz 给出是整个区域(= 单个数字),如果您想查看区域如何随时间增长(@ 987654335@). @ZiziArcher 你太有帮助了!非常感谢!

以上是关于数值积分函数的主要内容,如果未能解决你的问题,请参考以下文章

数值积分函数

计算方法数值积分

数值积分法的MATLAB实现

复化梯形求积分——用Python进行数值计算

Scipy---5.数值积分

玩转matlab之一维 gauss 数值积分公式及matlab源代码