অদ্ভুত ফলাফলের সাথে তৃতীয়-ক্রম বনাম চতুর্থ অর্ডার সিম্পিলিক ইন্টিগ্রেটারের পরীক্ষা


10

ইন আমার উত্তর একটি থেকে MSE প্রশ্ন একটি 2 ডি হ্যামিল্টনিয়ান পদার্থবিদ্যা সিমুলেশন সংক্রান্ত, আমি একটি উচ্চ-অর্ডার ব্যবহার পরামর্শ দিয়েছেন symplectic একত্রকারী

তারপরে আমি ভেবেছিলাম যে বিভিন্ন অর্ডার সহ পদ্ধতিগুলির গ্লোবাল নির্ভুলতার উপর বিভিন্ন সময়ের পদক্ষেপের প্রভাবগুলি প্রদর্শন করা ভাল ধারণা হতে পারে এবং আমি সেজন্য একটি পাইথন / পাইলাব স্ক্রিপ্ট লিখেছি এবং পরিচালনা করেছি। তুলনার জন্য আমি বেছে নিয়েছি:

আশ্চর্যের বিষয়টি হ'ল, আমি যে টাইমস্টেপটিই বেছে নিই না কেন, রুথের 3 য়-অর্ডার পদ্ধতিটি আমার পরীক্ষায় রুথের 4 র্থ-ক্রম পদ্ধতির চেয়েও যথাযথ বলে মনে হয়েছে, এমনকি একটি মাত্রার অর্ডার দিয়েও।

আমার প্রশ্ন তাই: আমি এখানে কি ভুল করছি? নিচে বিস্তারিত.

পদ্ধতিগুলি পৃথক পৃথক হ্যামিলটোনীয়দের সাথে সিস্টেমে তাদের শক্তি উদ্ঘাটন করে , অর্থাৎ যেগুলি হিসাবে লেখা যেতে পারে যেখানে সমস্ত অবস্থানের সমন্বয়কে সমন্বিত করে, সংঘবদ্ধ মুহূর্তকে সমন্বিত করে, গতিগতকে প্রতিনিধিত্ব করে শক্তি এবং সম্ভাব্য শক্তি।

H(q,p)=T(p)+V(q)
qpTV

আমাদের সেটআপে, জনসাধারণ প্রয়োগ করে তাদের দ্বারা আমরা বাহিনী এবং মুহুর্তগুলিকে স্বাভাবিক করতে পারি। সুতরাং বাহিনী ত্বরণে পরিণত হয়, এবং গতিবেগ বেগতে পরিণত হয়।

লক্ষণীয় ইন্টিগ্রেটারগুলি বিশেষ (প্রদত্ত, ধ্রুবক) সহগ সহ আসে যা আমি এবং । ঐ কোফিসিয়েন্টস সঙ্গে, সময় সিস্টেম নব্য জন্য এক ধাপ সময় ফর্ম নেয়a1,,anb1,,bntt+δt

  • জন্য :i=1,,n

    1. কম্পিউট ভেক্টর সব accelerations এর দেওয়া ভেক্টর সব পজিশনেরgq
    2. দ্বারা সমস্ত ভেক্টর পরিবর্তন করুনvbigδt
    3. all দ্বারা সমস্ত পজিশনের ভেক্টর পরিবর্তন করুনqaivδt

বুদ্ধি এখন সহগের মধ্যে রয়েছে। এগুলি

[একটি1একটি212]=[121201](Leap2)[একটি1একটি2একটি3123]=[23-23172434-124](Ruth3)[একটি1একটি2একটি3একটি41234]=12-23[121-2321-2321201-231](Ruth4)

পরীক্ষার জন্য, আমি 1 ডি প্রাথমিক মান সমস্যা y + y বেছে নিয়েছি

Y"+ +Y=0Y(0)=1Y'(0)=0
(Y(টি),Y'(টি))=(কোসাইন্টি,-পাপটি)
(কুই,বনাম)(Y,Y')

আমি এবং মধ্যে কোথাও বেছে নেওয়া একটি পূর্ণসংখ্যা সহ i of এর ধাপের সাথে উপরের পদ্ধতির সাথে আইভিপি সংহত করেছি । অ্যাকাউন্টে লিফ 2 এর গতি গ্রহণ করে আমি সেই পদ্ধতির জন্য তিনগুণ বাড়িয়েছি । আমি তখন পর্যায় স্থানের ফলাফলের বক্ররেখার প্লট করেছি এবং এ জুম করেছিলাম যেখানে বক্ররেখাগুলি আদর্শভাবে আবার পৌঁছাতে হবে ।টি[0,2π]δটি=2πএনএন10100এন(1,0)টি=2πএন(1,0)টি=2π

এবং জন্য প্লট এবং জুম রয়েছে :এন=12এন=36

এন = 12এন = 12, জুম করা

এন = 36এন = 36, জুম করা

জন্য , leap2 পদক্ষেপ আকার সঙ্গে চেয়ে বাড়ির কাছাকাছি পৌঁছা ঘটবে ruth4 পদক্ষেপ আকার সঙ্গে । জন্য , ruth4 উপর জয়ী leap2 । তবে, ruth4 হিসাবে একই ধাপের আকারের সাথে , roth3 , এখনও অবধি যে সমস্ত সেটিংসে আমি পরীক্ষা করেছি সেগুলিতে , অন্য উভয়ের তুলনায় বাড়ির খুব কাছাকাছি পৌঁছে।এন=122 π2π3এন 2π2πএনএন=36

পাইথন / পাইলাব লিপিটি এখানে:

import numpy as np
import matplotlib.pyplot as plt

def symplectic_integrate_step(qvt0, accel, dt, coeffs):
    q,v,t = qvt0
    for ai,bi in coeffs.T:
        v += bi * accel(q,v,t) * dt
        q += ai * v * dt
        t += ai * dt
    return q,v,t

def symplectic_integrate(qvt0, accel, t, coeffs):
    q = np.empty_like(t)
    v = np.empty_like(t)
    qvt = qvt0
    q[0] = qvt[0]
    v[0] = qvt[1]
    for i in xrange(1, len(t)):
        qvt = symplectic_integrate_step(qvt, accel, t[i]-t[i-1], coeffs)
        q[i] = qvt[0]
        v[i] = qvt[1]
    return q,v

c = np.math.pow(2.0, 1.0/3.0)
ruth4 = np.array([[0.5, 0.5*(1.0-c), 0.5*(1.0-c), 0.5],
                  [0.0,         1.0,          -c, 1.0]]) / (2.0 - c)
ruth3 = np.array([[2.0/3.0, -2.0/3.0, 1.0], [7.0/24.0, 0.75, -1.0/24.0]])
leap2 = np.array([[0.5, 0.5], [0.0, 1.0]])

accel = lambda q,v,t: -q
qvt0 = (1.0, 0.0, 0.0)
tmax = 2.0 * np.math.pi
N = 36

fig, ax = plt.subplots(1, figsize=(6, 6))
ax.axis([-1.3, 1.3, -1.3, 1.3])
ax.set_aspect('equal')
ax.set_title(r"Phase plot $(y(t),y'(t))$")
ax.grid(True)
t = np.linspace(0.0, tmax, 3*N+1)
q,v = symplectic_integrate(qvt0, accel, t, leap2)
ax.plot(q, v, label='leap2 (%d steps)' % (3*N), color='black')
t = np.linspace(0.0, tmax, N+1)
q,v = symplectic_integrate(qvt0, accel, t, ruth3)
ax.plot(q, v, label='ruth3 (%d steps)' % N, color='red')
q,v = symplectic_integrate(qvt0, accel, t, ruth4)
ax.plot(q, v, label='ruth4 (%d steps)' % N, color='blue')
ax.legend(loc='center')
fig.show()

আমি ইতিমধ্যে সাধারণ ত্রুটিগুলি পরীক্ষা করে দেখেছি:

  • কোনও উইকিপিডিয়া টাইপ নেই। আমি উল্লেখগুলি বিশেষভাবে ( 1 , 2 , 3 ) যাচাই করেছি ।
  • আমি সহগ ক্রম ঠিক পেয়েছি। আপনি যদি উইকিপিডিয়ায় আদেশের সাথে তুলনা করেন তবে নোট করুন যে অপারেটর প্রয়োগের ক্রমটি ডান থেকে বামে কাজ করে। আমার নম্বরটি ক্যান্ডি / রোজমাসের সাথে একমত হয় । এবং তবুও যদি আমি অন্য অর্ডার দেওয়ার চেষ্টা করি তবে ফলাফল আরও খারাপ হয়।

আমার সন্দেহ:

  • ভুল ধাপের ক্রম: সম্ভবত রুথের তৃতীয়-আদেশের স্কিমটি আরও কিছুটা ছোট ছোট সূচিত হয়েছে এবং যদি ধাপের আকারটি সত্যিই ছোট করা হয়, তবে চতুর্থ-আদেশের পদ্ধতিটি কী জিততে পারে? তবে আমি এমনকি এন=360 চেষ্টা করে দেখেছি এবং তৃতীয়-অর্ডার পদ্ধতিটি আরও উচ্চতর।
  • ভুল পরীক্ষা: আমার পরীক্ষা সম্পর্কে কিছু বিশেষ কি রূতের তৃতীয়-আদেশের পদ্ধতিটি একটি উচ্চ-অর্ডার পদ্ধতির মতো আচরণ করতে দেয়?

এনএন

@ কিরিল: এটি নিয়ে কাজ করছি। শীঘ্রই সম্পাদনা করা হবে।
22:55

1
একটি বিষয় যা সম্পর্কে আমি সন্দেহজনক তা হ'ল লিনিয়ার আরএইচগুলির চয়ন: পদ্ধতিগুলির কাটা ত্রুটিগুলি সাধারণত আরএইচএসের কিছু উচ্চ ডেরিভেটিভের উপর নির্ভর করে, তাই যদি আরএসএসের সমস্ত উচ্চ ডেরাইভেটিভগুলি বিলুপ্ত হয় তবে আপনি কিছু অদ্ভুত রূপান্তর আচরণ পর্যবেক্ষণ করতে পারেন। এটি সম্ভবত আরও অস্বাভাবিক আরএইচএস চেষ্টা করার উপযুক্ত।
কিরিল

উত্তর:


9

এনএন

ε(এন)=z- র~(2π)-z- র~(0)2কোথায়z- র~(টি)=(Y~(টি),Y~'(টি))
z- র~

এখানে চিত্র বর্ণনা লিখুন

41100

মজাদার. আমাকে আরও তদন্ত করতে হবে, সম্ভবত অন্যান্য পরীক্ষার চেষ্টা করে।

যাইহোক, ত্রুটি প্লটের জন্য পাইথন স্ক্রিপ্টে এখানে সংযোজন রয়েছে:

def int_error(qvt0, accel, qvt1, Ns, coeffs):
    e = np.empty((len(Ns),))
    for i,N in enumerate(Ns):
        t = np.linspace(qvt0[2], qvt1[2], N+1)
        q,v = symplectic_integrate(qvt0, accel, t, coeffs)
        e[i] = np.math.sqrt((q[-1]-qvt1[0])**2+(v[-1]-qvt1[1])**2)
    return e

qvt1 = (1.0, 0.0, tmax)
Ns = [12,16,20,24,32,40,48,64,80,96,128,160,192,
      256,320,384,512,640,768,1024,1280,1536,2048,2560,3072]

fig, ax = plt.subplots(1)
ax.set_xscale('log')
ax.set_xlabel(r"$N$")
ax.set_yscale('log')
ax.set_ylabel(r"$\|z(2\pi)-z(0)\|$")
ax.set_title(r"Error after 1 period vs #steps")
ax.grid(True)
e = int_error(qvt0, accel, qvt1, Ns, leap2)
ax.plot(Ns, e, label='leap2', color='black')
e = int_error(qvt0, accel, qvt1, Ns, ruth3)
ax.plot(Ns, e, label='ruth3', color='red')
e = int_error(qvt0, accel, qvt1, Ns, ruth4)
ax.plot(Ns, e, label='ruth4', color='blue')
ax.legend(loc='upper right')
fig.show()

প্রশ্নের সাথে প্রাসঙ্গিক নয়, তবে আপনি কি পৃথক উত্তর হিসাবে পোস্ট না করে প্রশ্নটিতে নিজেই পরিবর্তন এবং আপডেটগুলি রাখতে পারেন? এই Wold কনভেনশন যে উত্তর উচিত বজায় রাখা উত্তর প্রশ্ন।
কিরিল

1
@Kirill: এটা হল একটি উত্তর। ruth3 এর প্রকৃতপক্ষে এখানে উচ্চতর অর্ডার এবং কম ধ্রুবক রয়েছে। লগ-লগ ত্রুটি প্লট করার আপনার পরামর্শের কারণে আবিষ্কার করা হয়েছে। সুতরাং প্রশ্নের উত্তর দেওয়া হয়েছে, এবং আমি একবারই উত্তর হয়ে যাওয়ার পরে সিদ্ধান্তটির সিদ্ধান্তটি পরিবর্তন করব না, এমনকি উত্তরটি আমার দ্বারা রচিত হয়েছে তা না হলেও।
22:55

এটি বলেছিল, আমি আরও বিশ্লেষণ গ্রহণ করতে পেরে খুশি হব। (স্ব-
উত্তরযুক্ত

2
পি00ভী(কুই)=1/কুই+ +লগকুইভী
কিরিল

2
এটি সুপার কনভারজেন্সের প্রদর্শন is এর মতো সাধারণ পরীক্ষার সমস্যাগুলি অনেক ক্ষেত্রে এই সমস্যাটি সমাপ্ত করে। রৈখিক সমীকরণ ব্যবহার করা এই আচরণটি দিতে পারে এবং যখন ঘটে তখন টেলর সিরিজের বিজোড় পদগুলি বাতিল করতে পারে। বিশ্লেষণাত্মক সমাধান ব্যতীত ননলাইনার পরীক্ষার সমস্যাটি হওয়ার সম্ভাবনা খুব কম থাকে।
ক্রিস রাকাকাকাস

2

কুই¨=-কুইকুই(0)=1,কুই˙(0)=0

এখানে চিত্র বর্ণনা লিখুন

যেমনটি প্রত্যাশিত, সাব-অন্তরগুলির সংখ্যা বাড়ানোর জন্য গ্রাফগুলি ক্রমবর্ধমান সীমাবদ্ধ বক্ররেখার কাছে পৌঁছায় যা অগ্রণী ত্রুটি সহগ হয়। একটি প্লট ব্যতীত এই রূপান্তরটি দৃশ্যমান দ্রুত, প্রায় কোনও বিচ্যুতি নেই। এর অর্থ এটি এমনকি তুলনামূলকভাবে বড় পদক্ষেপের আকারের ক্ষেত্রেও নেতৃস্থানীয় ত্রুটি পদটি অন্য সমস্ত পদগুলিকে প্রাধান্য দেয়।

পি

কুইটি=2πপি

কুই3π/2


কুই¨=-পাপ(কুই)কুই(0)=1.3, q˙(0)=0

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.