数值积分函数
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。你也可以使用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))
【讨论】:
@ZiziArcher 非常感谢!我想用trapz
询问你的情况。我将它添加到代码中,但情节是一样的。我应该改变其他东西吗?
@Jane Integral 由trapz
给出是整个区域(= 单个数字),如果您想查看区域如何随时间增长(@ 987654335@).
@ZiziArcher 你太有帮助了!非常感谢!以上是关于数值积分函数的主要内容,如果未能解决你的问题,请参考以下文章