روش ژاکوبی

از testwiki
نسخهٔ تاریخ ۲۰ آوریل ۲۰۲۰، ساعت ۱۲:۱۰ توسط imported>Xqbot (Bot: Replace deprecated <source> tag and "enclose" parameter [https://lists.wikimedia.org/pipermail/wikitech-ambassadors/2020-April/002284.html])
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)
پرش به ناوبری پرش به جستجو

روش ژاکوبی یک روش تکراری در حل دستگاه معادلات خطی است که در جبر خطی مورد بحث قرار می‌گیرد.

معرفی کلی

در یک دستگاه مربعی با n معادلۀ خطی:

A𝐱=𝐛

که:

A=[a11a12a1na21a22a2nan1an2ann],𝐱=[x1x2xn],𝐛=[b1b2bn].

اگر ماتریس A را به دو ماتریس به شکل زیر تفکیک کنیم:

A=D+RwhereD=[a11000a22000ann] and R=[0a12a1na210a2nan1an20].

از روش تکرار جواب را می‌توان به شکل زیر یافت:

𝐱(k+1)=D1(𝐛R𝐱(k)).

اگر این فرمول را بر اساس المانهایش مرتبط کنیم به این صورت در خواهد آمد:

xi(k+1)=1aii(bijiaijxj(k)),i=1,2,,n.

الگوریتم

حدس اولیه: x(0)
k=0
تا وقتی که همگرا نشده:
for i := 1 step until n do
σ=0
for j := 1 step until n do
if j ≠ i then
σ=σ+aijxj(k)
end if
پایان حلقه j
xi(k+1)=(biσ)aii
end (i-loop)
بررسی همگرایی
k=k+1

همگرایی

ρ(D1R)<1.
|aii|>ji|aij|.

در روش ژاکوبی گاهی علی‌رغم اینکه شرایط همگرایی برقرار نباشد، جواب همگرا می‌شود.

چند مثال

مثال۱

در Ax=b با داشتن مقدار اولیه (حدس اولیه)، جواب را بدست می آوریم.

A=[2157], b=[1113]andx(0)=[11].

با استفاده از رابطۀ x(k+1)=D1(bRx(k))، که در بالا توضیح داده شد، به تخمین x می پردازیم تا جواب بدست آید.

با بازنویسی رابطۀ اخیر به فرم ساده‌تر D1(bRx(k))=Tx(k)+C،که در آن T=D1R و C=D1b.

توجه کنید که R=L+U که L و U به ترتیب قسمت پایینی و بالایی A هستند.

با استفاده از مقادیر داده شده:

D1=[1/2001/7], L=[0050]andU=[0100].

we determine T=D1(L+U) as

T=[1/2001/7]{[0050]+[0100]}=[01/25/70].

Further, C is found as

C=[1/2001/7][1113]=[11/213/7].

With T and C calculated, we estimate x as x(1)=Tx(0)+C:

x(1)=[01/25/70][11]+[11/213/7]=[5.08/7][51.143].

با تکرار بعدی داریم:

x(2)=[01/25/70][5.08/7]+[11/213/7]=[69/1412/7][4.9291.714].

این فرایند تا جایی که همگرایی مشهود باشد تکرار می‌شود. (به عبارت دقیق تر Ax(n)b کوچک باشد). جواب پس از ۲۵ بار تکرار خواهد بود:

x=[7.1113.222].

مثال۲

فرض کنید معادلات زیر را بخواهیم حل کنیم:

10x1x2+2x3=6,x1+11x2x3+3x4=25,2x1x2+10x3x4=11,3x2x3+8x4=15.

با انتخاب (0, 0, 0, 0) به عنوان تقریب اولیه:

x1=(600)/10=0.6,x2=(2500)/11=25/11=2.2727x3=(1100)/10=1.1,x4=(1500)/8=1.875.

پاسخ‌ها پس از ۵ بار تکرار در جدول زیر آورده شده است:

x1 x2 x3 x4
0.6 2.27272 1.1 1.875
1.04727 1.7159 0.80522 0.88522
0.93263 2.05330 1.0493 1.13088
1.01519 1.95369 0.9681 0.97384
0.98899 2.0114 1.0102 1.02135

جواب دقیق (1, 2, −1, 1) است.

حل مثال در پایتون

import numpy as np

ITERATION_LIMIT = 1000
# initialize the matrix
A = np.array([[10., -1., 2., 0.],
              [-1., 11., -1., 3.],
              [2., -1., 10., -1.],
              [0.0, 3., -1., 8.]])
# initialize the RHS vector
b = np.array([6., 25., -11., 15.])
# prints the system
print("System:")
for i in range(A.shape[0]):
    row = ["{}*x{}".format(A[i, j], j + 1) for j in range(A.shape[1])]
    print(" + ".join(row), "=", b[i])
print()

x = np.zeros_like(b)
for it_count in range(ITERATION_LIMIT):
    print("Current solution:", x)
    x_new = np.zeros_like(x)

    for i in range(A.shape[0]):
        s1 = np.dot(A[i, :i], x[:i])
        s2 = np.dot(A[i, i + 1:], x[i + 1:])
        x_new[i] = (b[i] - s1 - s2) / A[i, i]

    if np.allclose(x, x_new, rtol=1e-10):
        break

    x = x_new

print("Solution:")
print(x)
error = np.dot(A, x) - b
print("Error:")
print(error)

خروجی به این شکل خواهد بود:

System:
10.0*x1 + -1.0*x2 + 2.0*x3 + 0.0*x4 = 6.0
-1.0*x1 + 11.0*x2 + -1.0*x3 + 3.0*x4 = 25.0
2.0*x1 + -1.0*x2 + 10.0*x3 + -1.0*x4 = -11.0
0.0*x1 + 3.0*x2 + -1.0*x3 + 8.0*x4 = 15.0

Current solution: [ 0.  0.  0.  0.]
Current solution: [ 0.6         2.27272727 -1.1         1.875     ]
Current solution: [ 1.04727273  1.71590909 -0.80522727  0.88522727]
Current solution: [ 0.93263636  2.05330579 -1.04934091  1.13088068]
Current solution: [ 1.01519876  1.95369576 -0.96810863  0.97384272]
Current solution: [ 0.9889913   2.01141473 -1.0102859   1.02135051]
Current solution: [ 1.00319865  1.99224126 -0.99452174  0.99443374]
Current solution: [ 0.99812847  2.00230688 -1.00197223  1.00359431]
Current solution: [ 1.00062513  1.9986703  -0.99903558  0.99888839]
Current solution: [ 0.99967415  2.00044767 -1.00036916  1.00061919]
Current solution: [ 1.0001186   1.99976795 -0.99982814  0.99978598]
Current solution: [ 0.99994242  2.00008477 -1.00006833  1.0001085 ]
Current solution: [ 1.00002214  1.99995896 -0.99996916  0.99995967]
Current solution: [ 0.99998973  2.00001582 -1.00001257  1.00001924]
Current solution: [ 1.00000409  1.99999268 -0.99999444  0.9999925 ]
Current solution: [ 0.99999816  2.00000292 -1.0000023   1.00000344]
Current solution: [ 1.00000075  1.99999868 -0.99999899  0.99999862]
Current solution: [ 0.99999967  2.00000054 -1.00000042  1.00000062]
Current solution: [ 1.00000014  1.99999976 -0.99999982  0.99999975]
Current solution: [ 0.99999994  2.0000001  -1.00000008  1.00000011]
Current solution: [ 1.00000003  1.99999996 -0.99999997  0.99999995]
Current solution: [ 0.99999999  2.00000002 -1.00000001  1.00000002]
Current solution: [ 1.          1.99999999 -0.99999999  0.99999999]
Current solution: [ 1.  2. -1.  1.]
Solution:
[ 1.  2. -1.  1.]
Error:
[ -2.81440107e-08   5.15706873e-08  -3.63466359e-08   4.17092547e-08]

جستارهای وابسته

منابع

الگو:پانویس

الگو:جبر خطی عددی