如何使用matlab中的ode45不仅绘制解决方案而且绘制所有衍生物?

时间:2014-04-24 18:36:38

标签: matlab plot ode

我已经成功运行了一个代码,用于模拟不同载荷下梁的挠度。我使用Matlab和ode45求解器初始值问题。

我现在不仅要绘制偏差 y(x),还要绘制 dy / dx d ^ 2y / dx ^ 2 在同一个数字上,我很难实际做到这一点。希望有人可以给我一个提示。我想要的是绘制我在 MyFunctionL MyFunctionNL 上插入的函数,并将其与结果一起导出。我生成的代码之一如下:

function def1= def1(F,L)
%--------------------------------------------------------------
% Deflection 
% F [N] und L [mm]
% EI N*mm^2
% y[mm]
%--------------------------------------------------------------
global Fg Lg EI;
Fg = F;
Lg = L;
Em=200*10^9

%以下部分与问题无关

 for i=1:3
      if i==1
          b=0.055
          h=0.1
          Im=b*h^3/12
      end
      if i==2
          Im=2.5175*10^(-6)
      end
      if i==3
          re=0.065
          ri=0.060
          Im=pi/4*((re^4)-(ri^4))
      end

%As Im is in m^4 we are converting EI to N*mm^2 by multiplying it by (1000^2).    
EI=(Em*Im)*(1000^2)

$现在这部分是。

%Start point        
x0 = [0 0];
%Längenintervall
xspan = [0 L];
%Call Solver -> Linear
[x y] = ode45(@MyFunctionL,xspan, x0);
%Plot result
figure
plot(x,y(:,1));
if i==1  title('y(x) in a Retangular Profile') 
end
if i==2  title('y(x) in a Iprofile(IPE 100)')  
end
if i==3  title('y(x) in a Round hollow section') 
end
set(gca,'ydir','reverse')
xlabel('[mm]');
ylabel('[mm]');
hold on;
%Call Solver -> NonLinear
[x z] = ode45(@MyFunction,xspan, x0);
%Plot result
plot(x,z(:,1),'-r');
set(gca,'ydir','reverse')
end   
return

%---------------------------------------------------------------
function dy = MyFunctionL(x,y)
global Fg Lg EI;
dy = zeros(2,1);
dy(1) = y(2);
dy(2) = (Fg/EI)*(Lg - x);
return

function dy = MyFunction(x,y)
global Fg Lg EI;
dy = zeros(2,1);
dy(1) = y(2);
dy(2) = (Fg/EI)*(Lg - x)*(1+y(2)^2)^1.5;
return

1 个答案:

答案 0 :(得分:0)

您可以使用Matlab的diff()函数来计算数值导数。以下假设' x'中的最大值。是最后一个值,并且向量是等间距的。

dx=x(end)/length(x);         % Calculate dx

dy=diff(y)/dx;            % Calculate numerical derivative

dx2=x(end-1)/length(dy);  % Calculate dx2

d2y=diff(dy)/dx2;      % Calculate numerical second derivative

x=x(1:end-2);                % Shorten vectors for plotting
y=y(1:end-2);
dy=dy(1:end-1);

figure;plot(x,y,x,dy,x,d2y);

如果ode45()没有给你等间隔时间点,你应该像这样制作你的tspan矢量,比如你想要1000点:

tspan = linspace(0,L,1000);

在声明全局变量后,您也不需要分号。我认为这甚至可能搞砸了。

希望有帮助!