Documente Academic
Documente Profesional
Documente Cultură
Raport la
Lucrare de laborator Nr.2
la Metode și Modele de Calcul
Chișinau, 2019
Rezolvarea numerică a ecuațiilor neliniare
Sarcini de lucru:
1. Să se separe toate rădăcinile reale ale ecuației f(x)=0 , unde y=f(x) este o funcție
reală de variabilă reală.
2. Să se determine o rădăcină reală a ecuației date cu ajutorul metodei injumătățirii
intervalului cu o eroare mai mică decît ε=10-2 .
3. Să se precizeze rădăcina obținută cu exactitatea ε=10-6 , utilizînd:
Metoda aproximațiilor succesive;
Metoda tangentelor(Newton);
Metoda secantelor.
4. Să se compare rezultatele luînd în considerație numărul de iterații,evaluările pentru funcții
și derivată.
Varianta:
8 2 −3 6
A= 2 9 −4 b = −7
−3 −4 8 1
1. Metoda Cholesky
from __future__ import print_function
from math import sqrt
def cholesky(A):
L = [[0.0] * len(A) for _ in range(len(A))]
for i in range(len(A)):
for j in range(i+1):
s = sum(L[i][k] * L[j][k] for k in range(j))
L[i][j] = sqrt(A[i][i] - s) if (i == j) else \
(1.0 / L[j][j] * (A[i][j] - s))
return L
A = [[ 8, 2, -3 ],
[ 2, 9, -4 ],
[ -3, -4, 8 ]]
b = [6, -7, 1]
Q = cholesky(A)
y0 = b[0] / Q[0][0]
y1 = (b[1] - Q[1][0] * y0) / Q[1][1]
y2 = (b[2] - Q[2][0] * y0 - Q[2][1] * y1) / Q[2][2]
x3 = y2 / Q[2][2]
x2 = (y1 - Q[2][1] * x3) / Q[1][1]
x1 = (y0 - Q[2][0] * x3 - Q[1][0] * x2) / Q[0][0]
ITERATION_LIMIT = 1000
b = np.array([6., -7., 1. ])
x = np.zeros_like(b)
for it_count in range(ITERATION_LIMIT):
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, atol=0.01):
break
x = x_new
print("Solutia curenta",x)
print("\nSolutia:")
print(x)
error = np.dot(A, x) - b
print("\nErori:")
print(error)
print("\nIteratii: ", (it_count))
Rezultat
3. Metoda Gauss-Seidel:
def seidel(a, x ,b):
#Finding length of a(3)
n = len(a)
# for loop for 3 times as to calculate x, y , z
for j in range(0, n):
# temp variable d to store b[j]
d = b[j]