对函数进行数值积分

问题描述 投票:0回答:1

我在 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 中对该函数进行数值积分(我想是这样称呼的)吗?

所以从这里 得到这个

function matlab numerical-integration
1个回答
0
投票

对于数值积分,您可能应该使用简单的

trapz
https://www.mathworks.com/help/matlab/ref/trapz.html。您还可以使用
integral
https://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))
© www.soinside.com 2019 - 2024. All rights reserved.