ทำไมการแก้ปัญหาเชิงตัวเลขของ ODE จึงย้ายออกจากสมดุลที่ไม่เสถียร?


15

ฉันต้องการจำลองพฤติกรรมของระบบลูกตุ้มแบบสองเท่า ระบบนี้เป็นหุ่นยนต์หุ่นยนต์ 2 องศาอิสระที่ไม่ได้ถูกกระตุ้นและจะทำตัวเป็นเหมือนลูกตุ้มสองเท่าที่ได้รับผลกระทบจากแรงโน้มถ่วง ข้อแตกต่างที่สำคัญเพียงอย่างเดียวกับลูกตุ้มคู่คือประกอบด้วยวัตถุแข็งสองตัวที่มีคุณสมบัติมวลและความเฉื่อยที่จุดศูนย์กลางมวล

โดยทั่วไปฉันตั้งโปรแกรมode45ภายใต้ Matlab เพื่อแก้ปัญหาระบบ ODE ของประเภทต่อไปนี้:

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

โดยที่x1คือมุมของร่างกายแรกที่เกี่ยวกับแนวนอนx2คือความเร็วเชิงมุมของร่างกายแรก x3คือมุมของร่างกายที่สองที่เกี่ยวกับร่างกายแรกและx4คือความเร็วเชิงมุมของร่างกายที่สอง สัมประสิทธิ์ทั้งหมดมีการระบุไว้ในรหัสต่อไปนี้ในrhsและfMassฟังก์ชั่นที่ฉันสร้างขึ้น

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

สังเกตุว่าฉันตั้งเงื่อนไขเริ่มต้นของx1 (มุมของร่างกายแรกที่เกี่ยวกับแนวนอน) เพื่อให้ระบบเริ่มต้นในแนวตั้งอย่างสมบูรณ์ ด้วยวิธีนี้เนื่องจากแรงโน้มถ่วงเท่านั้นที่ทำหน้าที่ผลลัพธ์ที่ชัดเจนคือระบบไม่ควรเคลื่อนที่จากตำแหน่งนั้น

หมายเหตุ: ในกราฟิกด้านล่างทั้งหมดฉันได้วางแผนการแก้ปัญหาx1และx3ตามเวลา

ode45

เมื่อฉันรันการจำลองเป็นเวลา 6 วินาทีด้วยode45ฉันจะได้รับโซลูชันที่คาดหวังโดยไม่มีปัญหาเลยระบบยังคงอยู่ที่เดิมและไม่เคลื่อนที่:

enter image description here

อย่างไรก็ตามเมื่อฉันรันการจำลองเป็นเวลา 10 วินาทีระบบจะเริ่มเคลื่อนไหวอย่างไม่มีเหตุผล:

enter image description here

ODE23

จากนั้นฉันก็ทำการจำลองด้วยode23เพื่อดูว่าปัญหายังคงอยู่หรือไม่ ฉันจบลงด้วยพฤติกรรมที่เหมือนกันเฉพาะเวลานี้ความแตกต่างเริ่มต้นที่ 1 วินาทีต่อมา:

enter image description here

ODE15s

จากนั้นฉันก็ทำการจำลองด้วยode15sเพื่อดูว่าปัญหายังคงอยู่หรือไม่ระบบดูเหมือนจะเสถียรแม้ในช่วง 100 วินาที:

enter image description here

จากนั้นอีกครั้ง ode15sode15sMaxStep0.01ode45ode23

enter image description here

โดยปกติแล้วผลลัพธ์ที่ชัดเจนของการจำลองเหล่านี้ก็คือระบบจะอยู่ที่ตำแหน่งเริ่มต้นเนื่องจากไม่มีสิ่งใดรบกวนระบบดังกล่าว ทำไมความแตกต่างนี้จึงเกิดขึ้น มันมีบางอย่างเกี่ยวกับความจริงที่ว่าระบบประเภทนี้มีความวุ่นวายในธรรมชาติหรือไม่? นี่เป็นพฤติกรรมปกติของodeฟังก์ชั่นใน Matlab หรือไม่?


นอกจากสมการแล้วฉันคิดว่าแผนผังจะช่วยให้เข้าใจคำถามได้เป็นอย่างดี
nicoguaro

หากคุณคิดว่าเหมาะสมคุณอาจยอมรับคำตอบอย่างใดอย่างหนึ่ง (มีปุ่มสีเขียว)
Ertxiem - คืนสถานะโมนิก้า

คุณไม่พูด แต่คุณดูเหมือนจะได้รับการวางแผนและx1 x3(แสดงความคิดเห็นเกี่ยวกับการแทรกแห้งโดยไม่ต้องกราฟตำนานหรือคำอธิบาย.) ลองวางแผนลอการิทึมของ (ค่าแน่นอนของ) และx2 x4
Eric Towers

คำตอบ:


15

ฉันคิดว่าประเด็นหลักสองข้อนั้นเกิดขึ้นแล้วโดย Brian และ Ertxiem: ค่าเริ่มต้นของคุณคือดุลยภาพที่ไม่เสถียรและความจริงที่ว่าการคำนวณเชิงตัวเลขของคุณนั้นไม่แม่นยำอย่างแท้จริงจะทำให้เกิดความวุ่นวายเล็กน้อย

หากต้องการให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการเล่นให้พิจารณาปัญหาของคุณในรูปแบบของปัญหาค่าเริ่มต้นทั่วไป

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~

ในรหัสของคุณคุณสามารถทดสอบได้โดยการคำนวณ

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

ซึ่งให้ 6.191e-16 - ดังนั้นเกือบ แต่ไม่เป็นศูนย์แน่นอน สิ่งนั้นส่งผลต่อการเปลี่ยนแปลงของระบบของคุณอย่างไร?

fy0y~0

นอกจากนี้ในช่วงเวลาสั้น ๆ โซลูชันของระบบของคุณดูเหมือนโซลูชันของระบบเชิงเส้น

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).

ฉันไม่สามารถใส่ใจกับการคำนวณยาโคเบียนด้วยมือดังนั้นฉันจึงใช้ความแตกต่างแบบอัตโนมัติเพื่อให้ได้การประมาณที่ดี:

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

เพื่อให้สมการของคุณกลายเป็น

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

ตอนนี้เราต้องการหนึ่งขั้นตอนสุดท้าย: เราสามารถคำนวณการสลายตัวในลักษณะเฉพาะของจาโคเบียนเช่นนั้น

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
หากคุณตรวจสอบตัวแปรสถานะอย่างระมัดระวัง (โดยดูที่ค่าที่พิมพ์ไว้ในสัญกรณ์ทางวิทยาศาสตร์) คุณควรจะเห็นการเคลื่อนไหวเริ่มต้นช้ามากห่างจากความสมดุล
Brian Borchers

สิ่งนี้สมเหตุสมผลและเมื่อฉันเริ่มระบบในแนวตั้งลง (เป็นจุดสมดุลที่มั่นคง) ระบบจะไม่เคลื่อนที่เลยอย่างน้อยก็สำหรับการจำลอง 1,000 วินาทีซึ่งฉันพิจารณาระยะเวลานานมาก .
jrojasqu

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

@jrojasqu เพียงเพื่อให้ชัดเจนอย่างชัดเจนในสิ่งที่ได้รับการกล่าว: ตัวแปรของคุณจะถูกแสดงด้วยความแม่นยำสองครั้งลอยซึ่งสามารถแสดงชุดของตัวเลขแน่นอนและ π/2ไม่ใช่หนึ่งในหลาย ๆ เหตุผลสิ่งที่ง่ายที่สุดคือมันไม่มีเหตุผลและมีจำนวนอนันต์ แต่ทุ่นลอยมีจำนวนหลักแน่นอน Zero เป็นสมาชิกของชุดนี้และสามารถแสดงได้อย่างแน่นอน
llama

1
โปรดทราบว่าหากไม่ได้แสดงทิศทางตรงลง θ=0คุณควรเห็นการเคลื่อนไหวบางอย่างที่คุณคาดว่าจะไม่มีทางคณิตศาสตร์ แต่ในกรณีนี้มันจะสั่นเกี่ยวกับความสมดุลที่มั่นคงพร้อมแอมพลิจูดตามลำดับความแม่นยำลอย ( 10-16สำหรับคู่)
ลามะ

4

ดูส่วนประกอบของแรงที่คำนวณในหน้าที่ของคุณ

คุณอาจจะพบว่าพวกเขาไม่เคยเป็นศูนย์อย่างแน่นอนเพราะอย่างที่คำตอบอื่น ๆ ได้กล่าวไว้คุณไม่สามารถแสดงคุณค่าของπ แน่นอนในคอมพิวเตอร์คณิตศาสตร์และรูทีนที่คำนวณฟังก์ชั่นตรีโกณมิติไม่แน่นอนเช่นกัน

ในที่สุดกองกำลังจิ๋ว (อาจจะเป็นระเบียบ 10-16 เมื่อเริ่มต้น) จะย้ายระบบออกจากตำแหน่งที่ไม่เสถียร

ในขณะที่การกระจัดของระบบยังคงมีขนาดเล็กมากการคำนวณทั้งหมดจะสูญเสียความแม่นยำมากผ่านข้อผิดพลาดในการปัดเศษ (คุณกำลังทำการคำนวณคล้ายกับ a=1.0; a=a+10-16) ดังนั้นจำนวนเวลาก่อนที่ระบบจะ "ล้มล้าง" ในการจำลองจะขึ้นอยู่กับวิธีการรวมที่คุณใช้ขั้นตอนเวลาที่คุณขอ ฯลฯ


4

ข้อสันนิษฐานเบื้องต้นคือตำแหน่งเริ่มต้นอยู่ที่สมดุลคงที่ (กล่าวคือพลังงานศักย์ต่ำสุด) โดยมีศูนย์พลังงานจลน์เป็นศูนย์และระบบเริ่มเคลื่อนตัวออกจากสมดุล
เนื่องจากร่างกายไม่สามารถเกิดขึ้นได้ (ถ้าเราพิจารณากลไกแบบคลาสสิก) มีสองสิ่งที่อยู่ในใจของฉัน:

  1. สิ่งแรกคือบางทีตำแหน่งเริ่มต้น: ลูกตุ้มทั้งสองชี้ขึ้นπ/2 แทน -π/2?) ซึ่งเป็นจุดสมดุลที่ไม่มั่นคง

  2. อย่างที่สองคืออาจมีบางอย่างผิดปกติกับสมการการเคลื่อนที่ คุณกรุณาเขียนสมการอย่างชัดเจนได้ไหม บางทีคุณอาจพล็อตความเร่งเชิงมุมเป็นฟังก์ชันของตำแหน่งเริ่มต้นของลูกตุ้มแต่ละตัวโดยสมมติว่าความเร็วเชิงมุมเป็นศูนย์เพื่อตรวจสอบว่ามีบางสิ่งแปลก ๆ หรือไม่


1
อันที่จริงฉันเริ่มระบบในแนวตั้งขึ้น ดังนั้นจึงเป็นจุดสมดุลที่ไม่มั่นคง ความคิดเห็นของ Brian Borcher ทำให้คำตอบของคุณเสร็จสมบูรณ์โดยการอธิบายปัญหาด้วยπการประมาณค่าซึ่งนำไปสู่ระบบในที่สุดก็ย้ายจากตำแหน่งนั้น
jrojasqu

2
อย่างไรก็ตามเพื่อความสนุกสนานถ้าคุณต้องการให้ระบบอยู่ในตำแหน่งแนวตั้งที่ไม่เสถียรคุณสามารถเปลี่ยนจุดเริ่มต้นของพิกัดเป็นมุมเท่ากับศูนย์ชี้ขึ้น
Ertxiem - คืนสถานะโมนิก้า

@Ertxiem อีกตัวเลือกหนึ่งคือการแนะนำแรงเสียดทานเล็กน้อยในพินที่จะกินข้อผิดพลาดเชิงตัวเลข
svavil

@Ertxiem เพื่อความสนุกฉันพยายามเปลี่ยนระบบพิกัดเพื่อให้ศูนย์เป็นศูนย์ทำให้ระบบชี้ขึ้น มันเป็นพารามิเตอร์ที่ดีที่สุดที่นี่ เห็นได้ชัดว่าระบบอยู่ในตำแหน่งขึ้นไปเรื่อย ๆ อย่างไรก็ตามการแกว่งยังคงเกิดขึ้น (น้อยที่สุดสำหรับ 1,000 วินาทีของการจำลอง แต่มี) ที่ตำแหน่งสมดุลคงที่ (ลงตรง) เพราะตอนนั้นมีบาป(π)ที่จะคำนวณในแรงที่เกิดจากพลังงานศักย์ ดังนั้นฉันยืนยันในความจริงที่ว่าถ้าฉันจำลองสิ่งนี้มานานพอระบบจะเริ่มเบี่ยงเบนไปจากตำแหน่งนั้น
jrojasqu

เนื่องจากร่างกายไม่สามารถเกิดขึ้นได้ - จากความเข้าใจที่ลึกซึ้งว่าเราอยู่ในสภาวะที่ไม่มั่นคงฉันจึงท้าทายสิ่งนี้ ระบบทางกายภาพ (ไม่มีแรงเสียดทานมากเกินไป) จะไม่อยู่ในสภาวะสมดุลที่ไม่เสถียร โดยทั่วไปหากคุณจำลองระบบจริงคุณจะต้องหลีกเลี่ยงการติดขัดในสภาวะที่ไม่มั่นคง (แต่ไปถึงที่นั่น) - เป็นคุณลักษณะไม่ใช่ข้อผิดพลาด (มีข้อยกเว้นบางประการที่หาได้ยากเช่นสถานะที่ไม่ติดเชื้อในระบบภูมิคุ้มกันซึ่งเป็นดุลยภาพที่ไม่เสถียรที่สามารถรักษาได้)
Wrzlprmft

0

คุณควรค้นหาเพิ่มเติมเกี่ยวกับลูกตุ้มคู่: มันคือสิ่งที่เราเรียกว่า "ระบบที่วุ่นวาย" แม้ว่าพวกเขาจะปฏิบัติตามกฎง่าย ๆ เริ่มต้นจากเงื่อนไขเริ่มต้นที่แตกต่างกันเล็กน้อยโซลูชั่นที่แยกออกค่อนข้างเร็ว การจำลองแบบตัวเลขสำหรับระบบประเภทนี้ไม่ใช่เรื่องง่าย ดูวิดีโอต่อไปนี้เพื่อรับข้อมูลเชิงลึกเกี่ยวกับปัญหา

สำหรับลูกตุ้มแบบง่ายหรือสองเท่าคุณสามารถเขียนสูตรสำหรับพลังงานทั้งหมดของระบบ สมมติว่าแรงเสียดทานถูกละเลยพลังงานทั้งหมดนี้จะถูกรักษาไว้โดยระบบวิเคราะห์ ตัวเลขนี้เป็นปัญหาอื่นทั้งหมด

ก่อนที่จะลองลูกตุ้มสองเท่าลองใช้ลูกตุ้มแบบง่าย คุณจะสังเกตเห็นว่าสำหรับวิธี Runge-Kutta ของการสั่งซื้อขนาดเล็กพลังงานของระบบจะเพิ่มขึ้นในแบบจำลองเชิงตัวเลขแทนที่จะเป็นค่าคงที่ที่เหลืออยู่ (นี่คือสิ่งที่เกิดขึ้นในแบบจำลองของคุณ: คุณไม่เคลื่อนไหวอะไรเลย) เพื่อป้องกันสิ่งนี้สามารถใช้วิธี RK ลำดับที่สูงขึ้นได้ (ode45 คือลำดับ 4; RK ของลำดับ 8 จะทำงานได้ดีขึ้น) มีวิธีการอื่น ๆ ที่เรียกว่า "วิธี symplectic" ซึ่งได้รับการออกแบบมาเพื่อให้การจำลองเชิงตัวเลขอนุรักษ์พลังงาน โดยทั่วไปคุณควรหยุดการจำลองทันทีที่พลังงานเพิ่มขึ้นอย่างมีนัยสำคัญเมื่อเทียบกับการเริ่มต้นของคุณ

และพยายามที่จะเข้าใจลูกตุ้มง่าย ๆ ก่อนที่จะไปลูกตุ้มคู่


2
นี่ไม่ใช่เรื่องของระบบที่วุ่นวาย แต่ คุณสามารถมีสมดุลที่ไม่แน่นอนในระบบที่ไม่วุ่นวายเช่นลูกตุ้มเดี่ยวที่ "อยู่บนหัว" และมันจะแสดงพฤติกรรมแบบเดียวกันที่อธิบายไว้ในคำถาม
Daniel

1
มันก็ไม่เป็นความจริงที่พลังงานเพิ่มขึ้นสำหรับ RKM ของคำสั่งขนาดเล็ก: โดยปริยายออยเลอร์เป็นลำดับแรกและแสดงพฤติกรรมที่ตรงกันข้าม
Daniel

@BeniBogosel คุณพูดถึงวิธี symplectic ที่ดึงดูดความสนใจของฉันเพราะเห็นได้ชัดว่าในตัวอย่างของฉันพลังงานไม่ได้อนุรักษ์ อย่างไรก็ตามคุณสามารถระบุวิธี symplectic เฉพาะที่สามารถนำมาใช้ที่นี่ได้หรือไม่?
jrojasqu

@jrojasqu ทำไมคุณถึงพูดว่าพลังงานไม่ได้ถูกสงวนไว้ในระบบของคุณ?
Ertxiem - คืนสถานะโมนิก้า

@Ertxiem เมื่อฉันคำนวณพลังงานเชิงกลทั้งหมดของระบบ (Kinetic + ศักยภาพพลังงาน) ด้วยผลลัพธ์ที่ได้รับจากode45ฉันได้รับค่าที่เริ่มต้นด้วยศูนย์จากนั้นเติบโตตามเวลา ค่ามีขนาดเล็กมากในวินาทีแรก แต่ก็ยังเติบโตอย่างต่อเนื่องจากศูนย์ ฉันเชื่อว่าเป็นเพราะปัญหาที่ระบุไว้ในคำตอบข้างต้น (การประมาณπฯลฯ )
jrojasqu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.