Tại sao giải pháp số của ODE di chuyển khỏi trạng thái cân bằng không ổn định?


15

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 ode45theo Matlab để giải quyết một hệ thống ODE thuộc loại sau:

[10000M110M1200100M120M22][x˙1x˙2x˙3x˙4]=[x2V1G1x4V2G2]

Trong đó x1 là góc của vật thứ nhất so với phương ngang, x2 là tốc độ góc của vật thứ nhất; x3 là góc của thân thứ hai so với thân thứ nhất và x4 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 rhsvà các fMasshà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à x1 (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 x1x3 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:

nhập mô tả hình ảnh ở đây

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ý:

nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây

Sau đó, một lần nữa, ode15schỉ 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 ode15strong vòng 10 giây nhưng MaxStepkích thước 0.01 để 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 ode45ode23.

nhập mô tả hình ảnh ở đây

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 odechức năng trong Matlab?


Bên cạnh các phương trình, tôi nghĩ rằng một sơ đồ cũng sẽ giúp rất nhiều để hiểu b câu hỏi.
nicoguaro

Nếu bạn nghĩ rằng nó phù hợp, bạn có thể chấp nhận một trong những câu trả lời (có nút màu xanh lá cây).
Ertxiem - phục hồi Monica

Bạn không nói, nhưng dường như bạn đang âm mưu x1x3. (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) x2x4.
Tháp Eric

Câu trả lời:


15

Tôi nghĩ rằng hai điểm chính đã được Brian và Ertxiem đưa ra: giá trị ban đầu của bạn là trạng thái cân bằng không ổn định và thực tế là các tính toán số của bạn không bao giờ thực sự chính xác cung cấp sự nhiễu loạn nhỏ sẽ làm cho sự bất ổn xảy ra.

Để cung cấp thêm một chút chi tiết về cách điều này diễn ra, hãy xem xét vấn đề của bạn dưới dạng một vấn đề giá trị ban đầu chung

y˙(t)=M1f(t,y(t))
y(t)=(x1(t),x2(t),x3(t),x4(t))

f(t,y(t))=[x2V1G1x4V2G2]

f(0,y0)=0y˙(0)=0f~

Trong mã của bạn, bạn có thể kiểm tra điều đó bằng cách tính toán

norm(rhs(0,[pi/2 0 0 0]))

cung cấp cho 6.191e-16 - gần như không chính xác. Điều đó ảnh hưởng đến sự năng động của hệ thống của bạn như thế nào?

fy0y~0

Hơn nữa, trong một thời gian rất ngắn, giải pháp cho hệ thống của bạn trông giống như giải pháp của hệ thống tuyến tính hóa

y˙(t)=f(0,y0)+f(0,y0)(y(t)y0)=f(0,y0)(y(t)y0)

ffrhsy0d(t):=y(t)y0d

d˙(t)=f(0,y0)d(t).

Tôi không thể bận tâm để tính toán Jacobian bằng tay vì vậy tôi đã sử dụng phân biệt tự động để có được xấp xỉ tốt:

J:=f(0,y0)=[01009.8102.4525000012.452502.45250]

để phương trình của bạn trở thành

d˙(t)=Jd(t),d(0)=y~0y0

Bây giờ chúng ta cần một bước cuối cùng: chúng ta có thể tính toán phân tách eigenvalue của Jacobian sao cho

J=QDQ1

DJQde(t):=Q1d(t)

e˙(t)=De(t),e(0)=Q1d0.

D

e˙i(t)=λiei(t),ei(0)=ith component of Q1d0

i=1,2,3,4λ1=3.2485

e1(t)=e1(0)e3.2485t.

d(0)=0e(0)=Q1d(0)=0e1(0)=0e1(0)


16

π/2π/2


4
Nếu bạn theo dõi các biến trạng thái một cách cẩn thận (bằng cách xem các giá trị được in ra trong ký hiệu khoa học), bạn sẽ có thể thấy chuyển động rất chậm ban đầu ra khỏi trạng thái cân bằng.
Brian Borchers

Điều này có ý nghĩa và thực sự, khi tôi khởi động hệ thống ở vị trí thẳng đứng hướng xuống (là điểm cân bằng ổn định), hệ thống không di chuyển chút nào, ít nhất là trong một mô phỏng 1000 giây mà tôi cho là một khoảng thời gian rất dài .
jrojasqu

6
x1sin(0)cos(0)sin(pi/2)cos(pi/2)rhs(t,[0,0,0 0] == [0,0,0,0]

π/2

1
θ=0 1016

4

Nhìn vào các thành phần của các lực được tính toán trong các chức năng của bạn.

π

1016

Mặc dù độ dịch chuyển của hệ thống vẫn còn rất nhỏ, nhưng tất cả các phép tính sẽ mất rất nhiều độ chính xác thông qua các lỗi làm tròn (bạn đang thực hiện các phép tính tương tự như a=1.0a=a+1016


4

Giả định ban đầu là vị trí ban đầu ở trạng thái cân bằng ổn định (nghĩa là tối thiểu năng lượng tiềm năng) với động năng bằng không và hệ thống bắt đầu di chuyển khỏi trạng thái cân bằng.
Vì vật lý không thể xảy ra (nếu chúng ta xem xét cơ học cổ điển), có hai điều tôi nghĩ đến:

  1. Cái đầu tiên là có thể vị trí ban đầu là: cả hai con lắc hướng lên trên (π/2π/2

  2. Điều thứ hai là có lẽ có điều gì đó không ổn với các phương trình chuyển động (có lẽ là một lỗi đánh máy ở đâu đó?). Bạn có thể vui lòng viết các phương trình một cách rõ ràng? Có lẽ bạn có thể vẽ đồ thị gia tốc góc là một hàm của vị trí ban đầu của mỗi con lắc, giả sử vận ​​tốc góc bằng không để kiểm tra xem có gì lạ không.


1
π
jrojasqu

2
Nhân tiện, chỉ để cho vui, nếu bạn muốn giữ hệ thống ở vị trí thẳng đứng không ổn định, bạn có thể thay đổi gốc tọa độ của mình để có góc bằng 0 hướng lên trên.
Ertxiem - phục hồi Monica

@Ertxiem một tùy chọn khác là giới thiệu ma sát nhỏ trong các chân sẽ ăn các lỗi số.
Svavil

sin(π)

Vì thể chất không thể xảy ra - Với cái nhìn sâu sắc rằng chúng ta đang ở trạng thái cân bằng không ổn định, tôi phần nào thách thức điều này. Hệ thống vật lý (không có quá nhiều ma sát) không ở trạng thái cân bằng không ổn định. Tổng quát hơn, nếu bạn mô phỏng các hệ thống thực, bạn sẽ muốn tránh việc nó vô tình bị mắc kẹt trong trạng thái cân bằng không ổn định (tuy nhiên nó có ở đó) - đó là một tính năng, không phải là lỗi. (Có một số trường hợp ngoại lệ hiếm gặp về vấn đề này, chẳng hạn như trạng thái không bị nhiễm trùng trong miễn dịch học, đó là trạng thái cân bằng không ổn định có thể được duy trì.)
Wrzlprmft

0

Bạn nên tìm kiếm thêm về con lắc đôi: chúng là cái mà chúng ta gọi là "hệ thống hỗn loạn". Mặc dù họ hành xử theo các quy tắc đơn giản, bắt đầu từ các điều kiện ban đầu hơi khác nhau, các giải pháp phân kỳ khá nhanh. Làm mô phỏng số cho loại hệ thống này là không dễ dàng. Hãy xem video sau đây để hiểu rõ hơn về vấn đề.

Đối với con lắc đơn giản hoặc đôi, bạn có thể viết một công thức cho tổng năng lượng của hệ thống. Giả sử rằng lực ma sát bị bỏ qua, tổng năng lượng này được bảo toàn bởi hệ thống phân tích. Số này là một vấn đề hoàn toàn khác.

Trước khi thử con lắc đôi, hãy thử con lắc đơn giản. Bạn sẽ nhận thấy rằng đối với các phương pháp Runge-Kutta theo thứ tự nhỏ, năng lượng của hệ thống sẽ tăng lên trong các mô phỏng số, thay vì không đổi (đây là điều xảy ra trong các mô phỏng của bạn: bạn không di chuyển được gì). Để ngăn chặn điều này, các phương pháp RK bậc cao hơn có thể được sử dụng (ode45 là bậc 4; RK của lệnh 8 sẽ hoạt động tốt hơn). Có những phương pháp khác gọi là "phương pháp symplectic" được thiết kế sao cho mô phỏng số bảo tồn năng lượng. Nói chung, bạn nên dừng mô phỏng ngay khi năng lượng tăng đáng kể so với khởi tạo của bạn.

Và cố gắng hiểu con lắc đơn giản trước khi đi đôi.


2
Đây không phải là một vấn đề của hệ thống hỗn loạn, mặc dù. Bạn cũng có thể có trạng thái cân bằng không ổn định trong các hệ không hỗn loạn, ví dụ con lắc đơn là "trên đầu" và nó sẽ thể hiện hành vi tương tự được mô tả trong câu hỏi.
Daniel

1
Cũng không đúng khi tăng năng lượng cho RKM theo thứ tự nhỏ: ngầm định Euler ist thứ tự đầu tiên và hiển thị chính xác hành vi ngược lại.
Daniel

@BeniBogosel Bạn đề cập đến các phương pháp đối xứng thu hút sự chú ý của tôi bởi vì rõ ràng, trong ví dụ của tôi, năng lượng không được bảo toàn. Tuy nhiên, bạn có thể chỉ ra một phương pháp đối xứng cụ thể có thể được thực hiện ở đây không?
jrojasqu

@jrojasqu tại sao bạn nói rằng năng lượng không được bảo tồn trên hệ thống của bạn?
Ertxiem - phục hồi Monica

ode45π
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.