我已经编写了一个函数和一个脚本,在matlab中使用四阶runge-kutta方法计算和绘制一个1自由度系统的响应。以下是我想要绘制的系统对不同输入值的响应。我有零初始条件,输入如下:
F(t) = 5*sin(w*t)
其中w=[2 5 10]
我不知道如何在函数中使用循环来形成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,Y(:,2),'k','LineWidth',3)
是什么阻止您循环w
的值?
for w in [2 5 10]
[T Y] = ode45(@(t,y)Myfnc(t,y,w),t,Ics,opts)
plot...
您可能正在寻找arrayfun。这允许您将数字数组应用于同一函数。
例如,如果我有以下功能:
function y = power(x)
y = x*x;
end
然后我可以按如下方式使用它来将其应用于不同的值:
X = [1 2 3];
arrayfun(@(x) power(x),X,'UniformOutput',false);
正如你所看到的,我正在使用一个匿名函数来包装幂函数。此外,我使用"UniformOutput"为false,这样函数就可以在单元格数组中返回不同类型的元素。如果不希望使用单元格数组,请将其设置为true。