matlab練習程序(常微分方程組向量場)


過去有畫過常微分方程的向量場,通過向量場能夠很形象的看出方程解的狀態。

最近過節在家刷視頻刷到了3Blue1Brown介紹微分方程的視頻

視頻中對鍾擺建立的微分方程組通過向量場的形式也很形象的表達了系統狀態。

這里用matlab也實現一下,同時對三維情況也做了一個實現。

繪制的方法就是計算方程在二維或三維某個點的方向,然后把方向歸一化,畫出歸一化的向量即可。

二維微分方程組如下:

三維微分方程組如下:

matlab代碼如下:

二維情況:

clear all;close all;clc;

mu = 0.1;  
gdl = 1;  

x = -2:0.4:16;
y = -5:0.4:5;
[x,y] = meshgrid(x,y);

dx = y;
dy= -mu*y-gdl*sin(x);

d = sqrt(dx.^2+dy.^2);
dx = dx./d;
dy = dy./d;

quiver(x,y,dx,dy);
hold on;
[t,h] = ode45(@test,[0 100],[0.01 3]);    
plot(h(:,1),h(:,2),'r')

[t,h] = ode45(@test,[0 100],[0.01 2]);   
plot(h(:,1),h(:,2),'g')
grid on;
axis equal;

test.m:

function dy=test(t,x)
mu = 0.1;  
gdl = 1;  
dy=[x(2);
    -mu*x(2)-gdl*sin(x(1))];

結果:

紅色和綠色的線為方程組的兩個特解。

三維情況:

clear all;close all;clc;
a = 16;
b = 4;
c = 45;

x = -40:6:40;
y =-40:6:40;
z = 0:6:80;
[x,y,z] = meshgrid(x,y,z);

dx = a*(y-x);
dy = c*x - x.*z-y;
dz = x.*y-b*z;

d = sqrt(dx.^2+dy.^2+dz.^2);
dx = dx./d;
dy = dy./d;
dz = dz./d;
quiver3(x,y,z,dx,dy,dz);

hold on;
[t,h] = ode45(@test2,[0 30],[12 4 0]);
plot3(h(:,1),h(:,2),h(:,3));
grid on;
axis equal;

test2.m:

function dy=test2(t,y)
a = 16;
b = 4;
c = 45;

dy=[a*(y(2)-y(1));
    c*y(1)-y(1)*y(3)-y(2);
    y(1)*y(2)-b*y(3)];

結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM