روش ژاکوبی

از ویکی‌پدیا، دانشنامهٔ آزاد

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

معرفی کلی[ویرایش]

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

که:

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

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

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

الگوریتم[ویرایش]

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

همگرایی[ویرایش]

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

چند مثال[ویرایش]

مثال۱[ویرایش]

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

با استفاده از رابطۀ ، که در بالا توضیح داده شد، به تخمین می پردازیم تا جواب بدست آید.

با بازنویسی رابطۀ اخیر به فرم ساده‌تر ،که در آن و .

توجه کنید که که و به ترتیب قسمت پایینی و بالایی هستند.

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

we determine as

Further, C is found as

With T and C calculated, we estimate as :

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

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

مثال۲[ویرایش]

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

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

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

جواب دقیق (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]

جستارهای وابسته[ویرایش]

منابع[ویرایش]