我现在有一条振荡曲线,它是一组非线性常微分方程解的一部分。随着时间的推移,我需要测试这条曲线的稳定性/收敛性。如何用Matlab做到?
该图如下所示:
答案 0 :(得分:3)
自从我做了这样的事情以来已经八年了,所以我的答案很简单。
答案 1 :(得分:0)
我发现使用下面的脚本,它对我来说很好,但我仍然想知道,有没有更好的方法来预测收敛很长时间。
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