Tôi muốn mô phỏng hành vi của một hệ thống giống như con lắc đôi. Hệ thống này là một máy điều khiển robot tự do 2 độ không được kích hoạt và do đó, sẽ hoạt động chủ yếu giống như một con lắc đôi bị ảnh hưởng bởi trọng lực. Sự khác biệt chính duy nhất với một con lắc đôi là nó bao gồm hai vật cứng có tính chất khối lượng và quán tính tại tâm khối lượng của chúng.
Về cơ bản, tôi đã lập trình ode45
theo Matlab để giải quyết một hệ thống ODE thuộc loại sau:
Trong đó là góc của vật thứ nhất so với phương ngang, là tốc độ góc của vật thứ nhất; là góc của thân thứ hai so với thân thứ nhất và là vận tốc góc của thân thứ hai. Tất cả các hệ số được chỉ định trong đoạn mã sau, trong rhs
và các fMass
hàm tôi đã tạo.
clear all
opts= odeset('Mass',@fMass,'MStateDependence','strong','MassSingular','no','OutputFcn',@odeplot);
sol = ode45(@(t,x) rhs(t,x),[0 5],[pi/2 0 0 0],opts);
function F=rhs(t,x)
m=[1 1];
l=0.5;
a=[0.25 0.25];
g=9.81;
c1=cos(x(1));
s2=sin(x(3));
c12=cos(x(1)+x(3));
n1=m(2)*a(2)*l;
V1=-n1*s2*x(4)^2-2*n1*s2*x(2)*x(4);
V2=n1*s2*x(2)^2;
G1=m(1)*a(1)*g*c1+m(2)*g*(l*c1+a(2)*c12);
G2=m(2)*g*a(2)*c12;
F(1)=x(2);
F(2)=-V1-G1;
F(3)=x(4);
F(4)=-V2-G2;
F=F';
end
function M=fMass(t,x)
m=[1 1];
l=0.5;
Izz=[0.11 0.11];
a=[0.25 0.25];
c2=cos(x(3));
n1=m(2)*a(2)*l;
M11=m(1)*a(1)^2+Izz(1)+m(2)*(a(2)^2+l^2)+2*n1*c2+Izz(2);
M12=m(2)*a(2)^2+n1*c2+Izz(2);
M22=m(2)*a(2)^2+Izz(2);
M=[1 0 0 0;0 M11 0 M12;0 0 1 0;0 M12 0 M22];
end
Lưu ý cách tôi đặt điều kiện ban đầu là (góc của thân thứ nhất so với phương ngang) để hệ thống bắt đầu ở vị trí hoàn toàn thẳng đứng. Theo cách này, vì chỉ có lực hấp dẫn đang hoạt động, kết quả rõ ràng là hệ thống không nên di chuyển chút nào từ vị trí đó.
LƯU Ý: trong tất cả các đồ họa bên dưới, tôi đã vẽ các giải pháp và theo thời gian.
ODE45
Khi tôi chạy mô phỏng trong 6 giây ode45
, tôi nhận được giải pháp mong đợi mà không gặp vấn đề gì, hệ thống vẫn giữ nguyên vị trí và không di chuyển:
Tuy nhiên, khi tôi chạy mô phỏng trong 10 giây, hệ thống bắt đầu di chuyển không hợp lý:
ODE23
Sau đó tôi chạy mô phỏng ode23
để xem vấn đề còn tồn tại không. Tôi kết thúc với hành vi tương tự, chỉ lần này sự phân kỳ bắt đầu 1 giây sau:
ODE15
Sau đó tôi đã chạy mô phỏng ode15s
để xem vấn đề có còn tồn tại không và hệ thống có vẻ ổn định ngay cả trong 100 giây:
Sau đó, một lần nữa, ode15s
chỉ là thứ tự đầu tiên và lưu ý rằng chỉ có một vài bước tích hợp. Vì vậy, tôi đã chạy một mô phỏng khác ode15s
trong vòng 10 giây nhưng MaxStep
kích thước để tăng độ chính xác, và thật không may, điều này dẫn đến kết quả tương tự như với cả hai ode45
và ode23
.
Thông thường, kết quả rõ ràng của các mô phỏng này sẽ là hệ thống giữ nguyên vị trí ban đầu vì không có gì làm nhiễu loạn nó. Tại sao sự phân kỳ này xảy ra? Liệu nó có liên quan gì đến thực tế là các loại hệ thống này là hỗn loạn trong tự nhiên? Đây có phải là một hành vi bình thường cho các ode
chức năng trong Matlab?
x1
và x3
. (Chèn nhận xét khô khan về đồ thị mà không có truyền thuyết hoặc mô tả.) Hãy thử vẽ biểu đồ logarit của (các giá trị tuyệt đối của) x2
và x4
.