【问题标题】:How to include piecewise defined functions in bvp4c solver in Matlab如何在 Matlab 的 bvp4c 求解器中包含分段定义的函数
【发布时间】:2016-05-17 20:26:42
【问题描述】:

我在使用带有分段定义函数的 bvp4c 时遇到问题。 我测试了代码,当分段定义的函数是常量时它工作正常。 问题是在分段定义的函数不是常数的区域中,我在图表中得到了错误的结果(我肯定知道)。

关于如何处理这个问题有什么想法或建议吗?

谢谢

    function bvp4
    xlow=0;
    xhigh=0.30;
    solinit=bvpinit(linspace(xlow,xhigh,1000),[0 0]);
    sol = bvp4c(@bvp4ode,@bvp4bc,solinit);
    xint=[xlow:0.0001:xhigh];
    Sxint=deval(sol,xint);
    Sxint1=abs(sqrt(Sxint));
    xint=[xlow:0.0001:xhigh];
    plot(xint,Sxint1(1,:),'r')

    function dydx = bvp4ode(x,y)
    So=0.00125;
    s=1.5;
    dydx = [y(2);    
        ((G(x)+125*f(x)*y(1)*(1+1/s^2)^0.5-1000*9.81*So*H(x))/(1000*0.5*l(x)*(f(x)/8)^0.5)-y(2)*2*(-2/3*x+0.071+2/3*0.08)*(-2/3)*b(x))/H(x)/H(x)];


    function res = bvp4bc(ya,yb)
    res = [ya(1);        yb(1)];



    function fval = f(x)
if     (x >= 0) && (x <= 0.08)
    fval = 0.0187;
elseif  (x > 0.08) && (x <= 0.17)
    fval = 0.0298;
elseif  (x > 0.17) && (x <= 0.3)
    fval= 0.0408;
end


function Gval = G(xint)
if     (xint >= 0) && (xint <= 0.08)
    Gval = 0.1306;
elseif  (xint > 0.08) && (xint <= 0.17)
    Gval = 0.1306;
elseif  (xint > 0.17) && (xint <= 0.3)
    Gval = -0.0337;
end

function Hval = H(xint)
if     (xint >= 0) && (xint < 0.08)
    Hval = 0.071;
elseif  (xint >= 0.08) && (xint <= 0.17)
    Hval = -2/3*xint+(0.071+2/3*0.08);
elseif  (xint >0.17) && (xint <= 0.3)
     Hval = 0.011;
end

function bval = b(xint)
if     (xint >= 0) && (xint < 0.08)
    bval = 0;
elseif  (xint >= 0.08) && (xint <= 0.17)
    bval = 1;
elseif  (xint > 0.17) && (xint <= 0.3)
    bval= 0;
end


function lval = l(xint)
if     (xint >= 0) && (xint <= 0.08)
    lval = 0.067;
elseif  (xint > 0.08) && (xint <= 0.17)
    lval = 0.134;
elseif  (xint > 0.17) && (xint <= 0.3)
    lval= 1.165;
end

【问题讨论】:

    标签: matlab ode piecewise


    【解决方案1】:

    你不应该突然跳跃让你脆弱的求解器感到惊讶。

    任何顺序 p 求解器都需要一个 ODE 函数,该函数至少是 p 次连续可微分,以合理地适应网格点的网格。局部步长。任何偏差都会导致奇异点附近的过度适应和可能的振荡适应,从而导致计算时间长或步长下溢。

    我看到解决此问题的两种可能性,使用事件(如果支持 BVP)来切换模型/ODE 函数或使用提供的 multipoint mechanism 将积分间隔拆分为参数函数不变的部分。然后你也可以使用简单的数组来代替具有许多分支的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      相关资源
      最近更新 更多