有没有一种方法可以在函数f的内部绘制方程式(来自ODE系统)?

时间:2019-05-06 16:22:24

标签: matlab math differential-equations ode45

我正在尝试为我的微分方程类解决此分配问题,并且遇到了一些问题。

鉴于此ODE系统:

de

dy(1) = y(2) − y(3); dy(2) = −3*y(2) − 5*sin(ω*y(1)); dy(3) = y(1)*y(2); 。初始值:omega=3

y(1)=0; y(2)=4; y(3)=1;f之间绘制t=0

t=20

我首先尝试使用以下代码用ODE45模拟方程组:

在编辑器上:

f(t) = |2*cos(y1(t)) + y2(t)|

在命令标签上:

function dy=modelo10(t,y)
    global omega

    dy = zeros(3,1);
    dy(1)= y(2) - y(3);
    dy(2)= -3*y(2) - 5*sin(omega*y(1));
    dy(3)= y(1)*y(2);

end

我得到一个空白图形,出现以下错误:

>>global omega;
>>omega = 3;
>>[T,Y] = ode45(@modelo10, [0,20], [0,4,1]); 
%% I assign the function to variable f
>>f = @(t) 2.*cos(y(:,1)) + y(:,2);
%% And finally plot it with the values t
>>fplot(f, [0,20]);

所以我的问题是绘制Warning: Function behaves unexpectedly on array inputs. To improve performance, properly vectorize your function to return an output with the same size and shape as the input arguments. In matlab.graphics.function.FunctionLine>getFunction In matlab.graphics.function.FunctionLine/updateFunction In matlab.graphics.function.FunctionLine/set.Function_I In matlab.graphics.function.FunctionLine/set.Function In matlab.graphics.function.FunctionLine In fplot>singleFplot (line 241) In fplot>@(f)singleFplot(cax,{f},limits,extraOpts,args) (line 196) In fplot>vectorizeFplot (line 196) In fplot (line 166) Warning: Error updating FunctionLine. The following error was reported evaluating the function in FunctionLine update: Non-scalar in Uniform output, at index 1, output 1. Set 'UniformOutput' to false. Warning: Error updating FunctionLine. The following error was reported evaluating the function in FunctionLine update: Non-scalar in Uniform output, at index 1, output 1. Set 'UniformOutput' to false 的步骤(或命令)是什么?

我正在使用MATLAB R2019a。

2 个答案:

答案 0 :(得分:4)

您的第一个问题是定义f

[T,Y] = ode45(@modelo10, [0,20], [0,4,1]); 
f = @(t) 2.*cos(y(:,1)) + y(:,2);

请注意,第一行定义了一个变量Y,但是第二行使用了y。这些是不同的变量。这可能对您有用,因为您在工作空间中定义了变量y,但这样做做错了。

接下来,您的f是函数f(t),但未使用输入t对其进行定义。它总是输出相同的东西。 fplot期望一个函数输出与其输入大小相同的数组,这是您收到的错误消息。

但是,您无需在此处定义函数,您可以直接计算f的所有值并使用plot进行绘制:

[t,y] = ode45(@modelo10, [0,20], [0,4,1]);
f = 2.*cos(y(:,1)) + y(:,2);
plot(t,f)

此外,我建议您不要使用global。您在这里不需要它,您可以将omega定义为modelo10的输入参数:

function dy = modelo10(t,y,omega)
   dy = zeros(3,1);
   dy(1) = y(2) - y(3);
   dy(2) = -3*y(2) - 5*sin(omega*y(1));
   dy(3) = y(1)*y(2);
end

,然后按如下所示呼叫ode45

[t,y] = ode45(@(t,y)modelo10(t,y,omega), [0,20], [0,4,1]);

在这里,@(t,y)modelo10(t,y,omega)定义了一个匿名函数,该函数带有omega的值。根据{{​​1}}的要求,此匿名函数具有两个输入参数(ty)。

最后,您可以通过在一行上定义ode45来简化代码:

modelo10

您现在可以这样做:

function dy = modelo10(t,y,omega)
   dy = [ y(2) - y(3); -3*y(2) - 5*sin(omega*y(1)); y(1)*y(2) ];
end

答案 1 :(得分:2)

global omega;
omega = 3;

[T,Y] = ode45(@modelo10, [0,20], [0,4,1]);
  • 从这里开始,Y是T的函数->无需定义新函数 对于T = [0,20],Y = Y(T),这不再是变量,而是实数 Y = [Y1(0),...,Y1(20); Y2(0),...,Y2(20); Y3(0),...,Y3(20)]

  • 我将函数分配给变量f

    f = @(t) 2.*cos(y(:,1)) + y(:,2) --> f = abs( 2.*cos(Y(:,1)) + Y(:,2));
    
    小写字母y和大写字母Y是两个不同的变量。 Matlab中的绝对值函数是abs

  • 最后将其绘制为值t

    Use plot instead of fplot
    

    实际上,您不需要为函数f指定输入值 在计算ode45时已经包含在内,而fplot需要一个密钥 参数,即函数表达式

    (function handle --> function defined as follow f = @(x)_____). 
    

    输入可以另外添加为第二个参数。

    它是可选的;默认情况下,fplot评估[0 5]

  • 范围内的函数
  • f是实数而不是函数表达式,它已经被求值

        plot(T, f);
    

enter image description here       f的函数T的范围为0到20