روش ژاکوبی
روش ژاکوبی یک روش تکراری در حل دستگاه معادلات خطی است که در جبر خطی مورد بحث قرار میگیرد.
معرفی کلی
[ویرایش]در یک دستگاه مربعی با n معادلۀ خطی:
که:
اگر ماتریس A را به دو ماتریس به شکل زیر تفکیک کنیم:
از روش تکرار جواب را میتوان به شکل زیر یافت:
اگر این فرمول را بر اساس المانهایش مرتبط کنیم به این صورت در خواهد آمد:
الگوریتم
[ویرایش]- حدس اولیه:
- تا وقتی که همگرا نشده:
- for i := 1 step until n do
- for j := 1 step until n do
- if j ≠ i then
- end if
- if j ≠ i then
- پایان حلقه j
- end (i-loop)
- بررسی همگرایی
- for i := 1 step until n do
همگرایی
[ویرایش]در روش ژاکوبی گاهی علیرغم اینکه شرایط همگرایی برقرار نباشد، جواب همگرا میشود.
چند مثال
[ویرایش]مثال۱
[ویرایش]در با داشتن مقدار اولیه (حدس اولیه)، جواب را بدست می آوریم.
با استفاده از رابطۀ ، که در بالا توضیح داده شد، به تخمین می پردازیم تا جواب بدست آید.
با بازنویسی رابطۀ اخیر به فرم سادهتر ،که در آن و .
توجه کنید که که و به ترتیب قسمت پایینی و بالایی هستند.
با استفاده از مقادیر داده شده:
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]
جستارهای وابسته
[ویرایش]منابع
[ویرایش]- مشارکتکنندگان ویکیپدیا. «Jacobi method». در دانشنامهٔ ویکیپدیای انگلیسی، بازبینیشده در ۱۱ ژانویه ۲۰۱۵.