如何添加先前请求的时间函数作为 ODE 45 中的输入? [MATLAB]
How can I add a function of time requested previously as input in ODE 45? [MATLAB]
我遇到了这个问题:假设用户想要向 spring 质量阻尼器系统添加任意力(时间的函数)。为此,我们要求将力作为输入,即 F = cos(t)。好吧,我注意到如果我们在放置 F 的代码中添加一个时间函数(在 ODE 内),那么运动方程是正确的。但我找不到实现这一目标的方法。我的意思是,要求将力作为输入,以便 ODE 每次我施加新力时都会发生变化。我已经尝试了几乎所有方法,例如将输入 F 转换为函数等。
希望你能帮助我。这是代码中的问题:
F = input('Insert force F(t)..............[N] = ','s');
u0 = [x0,v0]; % INITIAL CONDITIONS AS A VECTOR
ODE = @(t,u) [u(2) ; F - (c/m)*u(2) - (k/m)*u(1)]; % FORCED SPRING MASS DAMPER SYSTEM
[t,u] = ode45(ODE, [0 tf], u0);
修复代码结果:
m = input('Insert mass of the system..........................[kg] = ');
c = input('Insert viscosity coefficient........................[ ] = ');
k = input('Insert elasticity constant..........................[m] = ');
x0 = input('Insert initial position.............................[m] = ');
v0 = input('Insert initial velocity...........................[m/s] = ');
tf = input('Insert time of complete movement....................[s] = ');
F = input('Insert external force as F(t).......................[N] = ','s');
F = str2func( ['@(t)' F] ); % CONVERT STRING TO FUNCTION
%=========================================================== ODE 45 =======
u0 = [x0,v0]; % INITIAL CONDITIONS AS A VECTOR
ODE = @(t,u) [u(2) ; F(t) - (c/m)*u(2) - (k/m)*u(1)];
[t,u] = ode45(ODE, [0 tf], u0);
u(:,3) = F(t) - (c/m)*u(:,2) - (k/m)*u(:,1); % ACCELERATION
%============================================================= PLOT =======
v = {'x','dx/dt','d2x/dt2'}; % CHAR VECTOR FOR PLOT
for i = 1:3 % PLOT WITH LOOP
subplot(3,1,i)
plot(t,u(:,i));
xlabel('t');
ylabel(v(i));
grid on;
end
代码仅供个人使用。不是 public 因为输入允许恶意命令。
感谢@Wolfie 和@Ander Biguri。
我将冒昧地将您的问题简化为主要部分。
您的用户 input
提供了一些字符数组,它根据 t
定义了一个函数。我将完全忽略盲目评估用户输入函数是危险的所有原因,但你不应该这样做。
您想根据 t
将此函数与现有函数组合以生成单个函数
我们可以这样做:
F = 'cos(t)'; % char version of function, e.g. from the input command
y = @(t) t; % some base function in terms of t
F = str2func( ['@(t)' F] ); % Convert function char to anonymous function
yF = @(t) y(t) + F(t); % combine the functions
你可以用一个快速绘图来测试这个
tt = 0:0.01:10; % axis data
figure; hold on;
plot( tt, y(tt), 'displayname', 'y(t)' );
plot( tt, yF(tt), 'displayname', 'yF(t)' );
legend('show');
在您的实际示例中,您用 ODE
代替了我的示例 f
,因此假设 F
被转换为如上所示的匿名函数,您将得到
ODE = @(t,u) [u(2) ; F(t) - (c/m)*u(2) - (k/m)*u(1)];
我遇到了这个问题:假设用户想要向 spring 质量阻尼器系统添加任意力(时间的函数)。为此,我们要求将力作为输入,即 F = cos(t)。好吧,我注意到如果我们在放置 F 的代码中添加一个时间函数(在 ODE 内),那么运动方程是正确的。但我找不到实现这一目标的方法。我的意思是,要求将力作为输入,以便 ODE 每次我施加新力时都会发生变化。我已经尝试了几乎所有方法,例如将输入 F 转换为函数等。
希望你能帮助我。这是代码中的问题:
F = input('Insert force F(t)..............[N] = ','s');
u0 = [x0,v0]; % INITIAL CONDITIONS AS A VECTOR
ODE = @(t,u) [u(2) ; F - (c/m)*u(2) - (k/m)*u(1)]; % FORCED SPRING MASS DAMPER SYSTEM
[t,u] = ode45(ODE, [0 tf], u0);
修复代码结果:
m = input('Insert mass of the system..........................[kg] = ');
c = input('Insert viscosity coefficient........................[ ] = ');
k = input('Insert elasticity constant..........................[m] = ');
x0 = input('Insert initial position.............................[m] = ');
v0 = input('Insert initial velocity...........................[m/s] = ');
tf = input('Insert time of complete movement....................[s] = ');
F = input('Insert external force as F(t).......................[N] = ','s');
F = str2func( ['@(t)' F] ); % CONVERT STRING TO FUNCTION
%=========================================================== ODE 45 =======
u0 = [x0,v0]; % INITIAL CONDITIONS AS A VECTOR
ODE = @(t,u) [u(2) ; F(t) - (c/m)*u(2) - (k/m)*u(1)];
[t,u] = ode45(ODE, [0 tf], u0);
u(:,3) = F(t) - (c/m)*u(:,2) - (k/m)*u(:,1); % ACCELERATION
%============================================================= PLOT =======
v = {'x','dx/dt','d2x/dt2'}; % CHAR VECTOR FOR PLOT
for i = 1:3 % PLOT WITH LOOP
subplot(3,1,i)
plot(t,u(:,i));
xlabel('t');
ylabel(v(i));
grid on;
end
代码仅供个人使用。不是 public 因为输入允许恶意命令。
感谢@Wolfie 和@Ander Biguri。
我将冒昧地将您的问题简化为主要部分。
您的用户
input
提供了一些字符数组,它根据t
定义了一个函数。我将完全忽略盲目评估用户输入函数是危险的所有原因,但你不应该这样做。您想根据
t
将此函数与现有函数组合以生成单个函数
我们可以这样做:
F = 'cos(t)'; % char version of function, e.g. from the input command
y = @(t) t; % some base function in terms of t
F = str2func( ['@(t)' F] ); % Convert function char to anonymous function
yF = @(t) y(t) + F(t); % combine the functions
你可以用一个快速绘图来测试这个
tt = 0:0.01:10; % axis data
figure; hold on;
plot( tt, y(tt), 'displayname', 'y(t)' );
plot( tt, yF(tt), 'displayname', 'yF(t)' );
legend('show');
在您的实际示例中,您用 ODE
代替了我的示例 f
,因此假设 F
被转换为如上所示的匿名函数,您将得到
ODE = @(t,u) [u(2) ; F(t) - (c/m)*u(2) - (k/m)*u(1)];