如何添加先前请求的时间函数作为 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。

我将冒昧地将您的问题简化为主要部分。

  1. 您的用户 input 提供了一些字符数组,它根据 t 定义了一个函数。我将完全忽略盲目评估用户输入函数是危险的所有原因,但你不应该这样做。

  2. 您想根据 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)];