我已经成功运行了一个代码,用于模拟不同载荷下梁的挠度。我使用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
答案 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);
在声明全局变量后,您也不需要分号。我认为这甚至可能搞砸了。
希望有帮助!