Python-ում գծային հավասարումների համակարգի լուծման Jacobi մեթոդի իրականացում


Սա ստորև ներկայացված գծային հավասարումների համակարգերի լուծման ամենաուղղակի կրկնվող ռազմավարությունն է:

$$\mathrm{a_{1,1}\: x_{1} \: + \: a_{1,2} \: x_{2} \: + \: \dotso\dotso \: + \: a_{1,n} \: x_{n} \:=\: b_{1}}$$

$$\mathrm{a_{2,1} \: x_{1} \: + \: a_{2,2} \: x_{2} \: + \: \dotso\ dotso \: + \: a_{2,n} \: x_{n} \:=\: b_{2}}$$

$$\mathrm{\vdots}$$

$$\mathrm{a_{n,1} \: x_{1} \: + \: a_{n,2} \: x_{2} \: + \: \dotso\ dotso \: + \: a_{n,n} \: x_{n} \:=\: b_{n}}$$

Հիմնարար հայեցակարգը հետևյալն է. յուրաքանչյուր գծային հավասարում վերակազմակերպվում է նոր փոփոխական տեղափոխելով ձախ կողմ: Նոր արժեքներն այնուհետև որոշվում են՝ սկսած յուրաքանչյուր փոփոխականի նախնական գուշակությունից: Հետևյալ կրկնության ընթացքում նոր արժեքները կօգտագործվեն որպես կրթված գուշակություն: Մինչև յուրաքանչյուր փոփոխականի կոնվերգենցիայի պայմանը բավարարված է, այս կրկնման գործընթացը կրկնվում է մինչև վերջնական կոնվերգենցիայի պատասխան ստանալը:

Յակոբիի ալգորիթմը

Յակոբիի ալգորիթմը հետևյալն է

  • Սկսեք անհայտների համար գուշակությունների նախնական զանգվածից (x):

  • Գնահատեք նոր x-երը՝ փոխարինելով գուշակական արժեքները x-ներով՝ վերադասավորվող հավասարումների ձևով, ինչպես ցույց է տրված ստորև −

$$\mathrm{x_{i_{new}} \:=\: − \frac{1}{a_{i,i}}(\sum_{j=1,j \neq i} ^n a_{i,j}x_{j_{կռահել}} \: − \: b_{i})}$$

Այժմ $\mathrm{x_{i_{new}}}$-ը կլինի ընթացիկ կրկնությունից ստացված նոր x արժեքը:

  • Հաջորդ քայլը նոր և գուշակական արժեքների միջև սխալի գնահատումն է, այսինքն՝ $\mathrm{\lvert x_{new} \: − \: x_{guess} \rvert}$: Եթե սխալն ավելին է, քան կոնվերգենցիայի որոշ չափանիշ (մենք այն ընդունել ենք որպես $\mathrm{10^{−5}}$), ապա նոր արժեքներ վերագրեք հին գուշակությանը, այսինքն՝ $\mathrm{x_{guess} \ :=\: x_{new}}$և այնուհետև սկսեք հաջորդ կրկնությունը:

  • Այլապես, $\mathrm{x_{new}}$-ը վերջնական պատասխանն է:

Յակոբիի ալգորիթմ – օրինակ

Եկեք ցույց տանք ալգորիթմը հետևյալ օրինակի օգնությամբ −

$$\mathrm{20x \: + \: y \: − \: 2z \:=\: 17}$$

$$\mathrm{3x \: + \: 20y \: − \: z \:=\: −18}$$

$$\mathrm{2x \: − \: 3y \: + \: 20z \:=\: 25}$$

Վերադասավորելով վերը նշված հավասարումները հետևյալ կերպ −

$$\mathrm{x_{new} \:=\: (−y_{guess} \: + \: 2z_{guess} \: + \: 17)/20}$$

$$\mathrm{y_{new} \:=\: (−3x_{guess} \: + \: z_{guess} \: − \: 18)/20}$$

$$\mathrm{z_{new} \:=\: (−2x_{guess} \: + \: 3y_{guess} \: + \: 25)/20}$$

Այժմ այս հավասարումները կլուծվեն while օղակում՝ գուշակության արժեքի հիման վրա անհայտների նոր արժեք ստանալու համար:

Python ծրագիր՝ Jacobi-ի մեթոդի իրականացման համար

Յակոբիի մեթոդի իրականացման ծրագիրը (հավասարման իմաստով իրականացում) ներկայացված է ստորև −

Օրինակ


# Importing module for plotting and array
from pylab import *
from numpy import *

# Initial guess to start with
xg=0
yg=0
zg=0

# Setting error to move into the while loop
error=1

# Setting up iteration counter
count=0

while error>1.E-5:
   count+=1
    
   #Evaluating new values based on old guess
   x=(17-yg+2*zg)/20
   y=(zg-18-3*xg)/20
   z=(25-2*xg+3*yg)/20

   # Error evaluation and plotting
   error = abs(x-xg)+abs(y-yg)+abs(z-zg)
   figure(1,dpi=300)
   semilogy(count,error,'ko')
   xlabel('iterations')
   ylabel('error')

   # Updating the Guess for next iteration.
   xg=x
   yg=y
   zg=z

savefig('error_jacobi.jpg')
print(f'x={round(x,5)}, y={round(y,5)}, z={round(z,5)}')

Արդյունք

Ծրագրի արդյունքը կլինի

$$\mathrm{x \:=\: 1.0 \: , \: y \:=\: -1.0 \: , \: z \:=\: 1.0}$$

Սխալի փոփոխությունը յուրաքանչյուր կրկնությունների քանակով ցույց է տրված ստորև տրված նկարում −

Կարելի է նկատել, որ համակցված լուծումը հասնում է 8-րդ կրկնությանը:

Բայց, կարծում եմ, ավելի լավ կլինի, եթե մենք կարողանանք գծային հավասարումների համակարգի տարրերը մուտքագրել մատրիցով և լուծել դրանք ոչ թե հավասարման ձևով, այլ մատրիցով: Այսպիսով, այս առաջադրանքը կատարելու ընթացակարգային ծածկագիրը հետևյալն է

Օրինակ


# Importing module
from pylab import *
from numpy import *

#-----------------------------------------#
# Array of coefficients of x
a=array([[20,1,-2],[3,20,-1],[2,-3,20]])

# Array of RHS vector
b=array([17,-18,25])

# Number of rows and columns
n=len(b)
#-----------------------------------------#


# Setting up the initial guess array
xg=zeros(len(b))

# Starting error to enter in loop
error=1

# Setting iteration counter
count=0

# Generating array for new x
xn=empty(len(b)) 
#-----------------------------------------#


while error>1.E-5:
   count+=1
   for i in range(n):
      sum1=0
      for j in range(n):
         if i!=j:
            sum1=sum1+a[i,j]*xg[j]
      xn[i]=(-1/a[i,i])*(sum1-b[i])


   # Error evaluation and plotting
   error = sum(abs(xn-xg))
    
   figure(1,dpi=300)
   semilogy(count,error,'ko')
   xlabel('iterations')
   ylabel('error')

   # Substituting new value as the Guess for next iteration
   xg=xn.copy()
#-----------------------------------------#

savefig('error_jacobi.jpg')
print('x: ',xn)

Արդյունք

x՝ [ 1.00000007 -0.99999983 1.00000005]

Եզրակացություն

Այս ձեռնարկում մենք բացատրեցինք, թե ինչպես կարող եք Python-ը օգտագործել Ջակոբիի կրկնության մեթոդը մոդելավորելու համար՝ միաժամանակյա գծային հավասարումներ լուծելու համար: Քննարկվել է երկու մոտեցում. հավասարման մոտեցում և մատրիցային մոտեցում: