روش ژاکوبی یک روش تکراری در حل دستگاه معادلات خطی است که در جبر خطی مورد بحث قرار میگیرد.
در یک دستگاه مربعی با 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]
جستارهای وابسته[ویرایش]
|
---|
اصول بنیادی | |
---|
مسالهها | |
---|
سختافزارها | |
---|
نرمافزارها | |
---|