如何数值测试振荡曲线的稳定性?

时间:2013-04-25 17:53:32

标签: algorithm matlab signal-processing differential-equations

我现在有一条振荡曲线,它是一组非线性常微分方程解的一部分。随着时间的推移,我需要测试这条曲线的稳定性/收敛性。如何用Matlab做到?

该图如下所示: enter image description here

2 个答案:

答案 0 :(得分:3)

自从我做了这样的事情以来已经八年了,所以我的答案很简单。

  1. 使用步长S和步长S / 2求解方程式;如果结果匹配(即在机器epsilon,或10x机器epsilon,或者你定义单词“匹配”),那么你很好继续截断错误
  2. 使用标准浮点运算求解方程,并用扩展精度算法求解它们(IIRC Matlab称这种可变精度算术; IEEE双精度算法使用52位有效数,因此80位有效数应该更多足以揭示由于舍入误差导致的不稳定性);如果结果匹配,那么你可以继续进行舍入错误

答案 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