在MATLAB中针对不同的输入值求解微分方程

问题描述

我已经编写了一个函数一个脚本,用于在Matlab中使用4阶runge-kutta方法计算和绘制1自由度系统的响应。这是我要绘制不同输入值的系统响应的东西。我的初始条件为零,输入如下:

F(t) = 5*sin(w*t)

其中w = [2 5 10]

我不知道如何在函数中使用循环来为w和w的所有值形成状态空间 求解我的方程式,并将其绘制为w的不同值,这会使每次迭代产生不同的输入。请注意,一种方法是针对所有三种情况编写三个不同的函数并计算响应,但我不希望如此。我只想要一个函数和我的脚本,它使用ode45函数来求解我的微分方程,但要绘制所有w值的响应。您如何建议我这样做。这是我的脚本和功能

function xDot = Myfnc(t,x)
global w
f = 5*sin(w*t);
%% Using State Space 

A = [0 1;-100 -1];
b = [0 f]';
xDot = A*x+b;
end




clc;
clear
close all;
%%
% y(..)+y(.)+100y = f(t)
% ZERO INITIAL conditions
% To A Harmonic Input
t = 0:0.1:15;
global w
w = 2;
Ics = [0 0];

[T,Y] = ode45(@Myfnc,t,Ics);

% plot(T,Y(:,1),'r','linewidth',4)
% grid on
% hold on
% plot(T,2),'k',3)

解决方法

您可能正在寻找arrayfun。这样,您就可以将数字数组应用于同一函数。

例如,如果我具有以下功能:

function y = power(x)
   y = x*x;
end

然后我可以按如下方式使用它来将其应用于不同的值:

X = [1 2 3];
arrayfun(@(x) power(x),X,'UniformOutput',false);

如您所见,我正在使用匿名函数来包装幂函数。 另外,我使用'UniformOutput'为false,因此该函数可以返回单元格数组中不同类型的元素。如果您不希望单元格数组将其设置为treu。

,

是什么使您无法遍历w的值?

for w in [2 5 10]
  [T Y] = ode45(@(t,y)Myfnc(t,y,w),t,Ics,opts)
  plot...