就是用ode45和symbolic方法 用这两种方法画这个方程的图
然后有几个已知条件 m=10 k=160 b=0(最好可以方便调节 后面我想让他不等于0) F0=200 w0=2
画出来应该差不多是这个样子
function rk=w2(t,x)
rk=[x(2);-16*(x(1))+20*sin(2*t)];
timerange=[0 20];
initialvalues=[-3 0];
[t,x]=ode45(@w2,timerange,initialvalues);
plot(t,x(:,1))
xlabel('time(s)')
ylabel('displacement(m)')
hold on
t=0:0.1:20;%(w=2)
x=(5.*sin(2.*t))/6 - 3.*cos(4.*t) - (5.*sin(4.*t))/3 - (5.*sin(6.*t))/8 + (5.*sin(10.*t))/24 + (5.*sin(4.*t).*(6.*tan(t).^2 - 3.*tan(t).^4 + 1))/(3.*(tan(t).^2 + 1).^3);
plot(t,x);
xlabel('time(s)')
ylabel('displacement(m)')
hold off
然后这个是代码 给你们提供一个大概的思路
这个代码上半部分是ode45 下半部分是symbolic方法
function solve_differential_equation() m = 10; k = 160; b = 0; F0 = 200; w0 = 2; % 使用ode45求解微分方程 timerange = [0 20]; initialvalues = [-3 0]; [t, x] = ode45(@(t,x) w2(t,x,m,k,b,F0,w0), timerange, initialvalues); % 绘制数值解 figure; plot(t, x(:,1)); xlabel('time(s)'); ylabel('displacement(m)'); hold on; % 使用符号方法求解微分方程 syms t x(t) eqn = diff(x, t, 2) + (k/m)*x == (F0/m)*sin(w0*t); cond = [x(0) == -3, diff(x)(0) == 0]; xSol(t) = dsolve(eqn, cond); % 绘制解析解 t = linspace(0, 20, 200); x = double(xSol(t)); plot(t, x); legend('Numerical Solution (ode45)', 'Analytical Solution'); hold off; end function dxdt = w2(t, x, m, k, b, F0, w0) dxdt = [x(2); -(k/m)*x(1) + (F0/m)*sin(w0*t)]; end
首先,你使用了ode45函数来解决微分方程,但是在函数w2中使用了ode45函数来重新计算微分方程的解,这是不正确的。其次,下半部分是使用符号方法直接给出了解析解,但是你没有将符号解与数值解进行比较。
让我们重新调整你的代码,首先使用ode45函数求解微分方程,并将结果绘制成图表。然后,我们可以使用符号方法得到解析解,并将其与数值解进行比较。这样你就能更好地理解两种方法的异同了。
鄂ICP备2023011697号-1 | Powered By 91代做