我在 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 中对该函数进行数值积分(我想是这样称呼的)吗?
对于数值积分,您可能应该使用简单的
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))