0

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

该图如下所示: 在此处输入图像描述

4

2 回答 2

3

自从我做这样的事情以来已经八年了,所以对我的回答持保留态度。

  1. 使用步长 S 和步长 S/2 求解方程;如果结果匹配(即在机器 epsilon 或 10x 机器 epsilon 内,或者您正在定义“匹配”这个词),那么您最好继续截断错误
  2. 使用标准浮点算术求解方程,也使用扩展精度算术求解它们(IIRC Matlab 称之为可变精度算术;IEEE 双精度算术使用 52 位有效数,因此 80 位有效数应该绰绰有余显示由于舍入误差导致的不稳定性);如果结果匹配,那么你可以继续舍入错误
于 2013-04-25T17:59:25.477 回答
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
于 2013-04-25T19:36:58.100 回答