所以我需要用初始条件x(0)= 0和v(0)= x'(0)=求解x'(t)= - x(t)^ p v_o = 1。 参数p的值为1.
这就是我所拥有的:
function [t, velocity, x] = ode_oscilation(p)
y=[0;0;0];
% transform system to the canonical form
function y = oscilation_equation(x,p)
y=zeros(2,1);
y(1)=y(2);
y(2)=-(x)^p;
% to make matlab happy we need to return a column vector
% so we transpose (note the dot in .')
y=y.';
end
tspan=[0, 30]; % time interval of interest
[t,velocity,x] = ode45(@oscilation_equation, tspan, 1);
t = y(:,1);
xposition=y(:,3);
velocity=y(:,2);
end
这是我收到的错误消息:
ode_oscillation(1) 使用odearguments时出错(第91行) ODE_OSCILLATION / OSCILATION_EQUATION必须返回一个 列向量。
ode45错误(第114行) [neq,tspan,ntspan,next,t0,tfinal,tdir,y0,f0, odeArgs,odeFcn,...
ode_oscillation出错(第17行) [t,velocity,x] = ode45(@oscilation_equation,tspan,1);
答案 0 :(得分:3)
这里有一些问题。首先,来自help ode45
:
ode45求解非刚性微分方程,中序方法。
[TOUT,YOUT] = ode45(ODEFUN,TSPAN,Y0) with TSPAN = [T0 TFINAL] integrates the system of differential equations y' = f(t,y) from time T0 to TFINAL with initial conditions Y0.
请注意,ode45
需要一个函数f(t,y)
,其中size(t) == [1 1]
表示时间,size(y) == [1 N]
或[N 1]
表示解决方案值。您的oscilation_equation
输入参数的顺序已反转,您输入的是常量参数p
而不是时间t
。
此外,初始条件Y0
应与y
的大小相同;所以size(y0) == [N 1]
或[1 N]
。您只有1
,这显然会导致错误。
此外,您的输出参数t
,xposition
和velocity
将被完全忽略且错误,因为y
未设置为输出参数来自ode45
,最重要的是,它们的名称与ode_oscilation
的输出参数不对应。此外,它们从y
列中提取的顺序不正确。
因此,总而言之,将所有内容都改为:
function [t, v, x] = ode_oscilation(p)
% initial values
y0 = [0 1];
% time interval of interest
tspan =[0 30];
% solve system
[t,y] = ode45(@(t,y) [y(2); -y(1)^p], tspan, y0);
% and return values of interest
x = y(:,1);
v = y(:,2);
end