我现在有一条振荡曲线,它是一组非线性常微分方程解的一部分。随着时间的推移,我需要测试这条曲线的稳定性/收敛性。用matlab怎么做?
该图如下所示:
我现在有一条振荡曲线,它是一组非线性常微分方程解的一部分。随着时间的推移,我需要测试这条曲线的稳定性/收敛性。用matlab怎么做?
该图如下所示:
自从我做这样的事情以来已经八年了,所以对我的回答持保留态度。
结果我使用了以下脚本,它对我来说很好,但我仍然想知道,有没有更好的方法来预测长时间的收敛。
function err = stability_test(t, y)
% Given data of an oscillating curve y(t), tell whether the oscillation
% amplitude decrease or not by
% 1. locating peaking points
% 2. linear fit peak points and see if the gradient is negative or not
%
% t, y must be of the same shape
% err = 0, non-ocillating
% < 0, stable
% > 0, unstable
nt = linspace(min(t), max(t), 500);
ny = interp1(t,y,nt,'spline');
ndy = gradient(ny,nt);
ndy2 = del2(ny,nt);
if(isempty(find(ndy<0, 1)) || isempty(find(ndy2>0, 1)))
err = 0;
else
ndt = nt(2) - nt(1);
ii = find(abs(ndy)<abs(ndt*ndy2*2) & ndy2<0);
if(isempty(ii))
err = 0;
else
if(length(ii)==1)
ii = [ii,length(ndy)];
end
ym = ny(ii);
tm = nt(ii);
p = polyfit(tm, ym,1);
err = p(1);
end
end