我正在尝试为我的微分方程类解决此分配问题,并且遇到了一些问题。
鉴于此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。
答案 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}}的要求,此匿名函数具有两个输入参数(t
和y
)。
最后,您可以通过在一行上定义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);