import numpy as np
# Те же F(x) из предыдущего кода
def F(X):
x, y, z = X
return np.array([
x**2 + x - y*z - 0.1,
-3*y + y**2 - x*z + 0.2,
2*z + z**2 + x*y - 0.3
], dtype=float)
# Якобиан J(x)
def J(X):
x, y, z = X
return np.array([
[2*x + 1, -z, -y],
[ -z, 2*y - 3, -x],
[ y, x, 2 + 2*z]
], dtype=float)
# Твой Гаусс
def gauss_solve(A, bb):
n = A.shape[0]
M = np.hstack((A.copy(), bb.reshape(-1, 1)))
# Прямой ход с выбором главного элемента по столбцу
for i in range(n):
max_row = i
for k in range(i + 1, n):
if abs(M[k, i]) > abs(M[max_row, i]):
max_row = k
M[[i, max_row]] = M[[max_row, i]] # перестановка строк
for k in range(i + 1, n):
if M[i, i] == 0:
raise ValueError("Нулевой ведущий элемент в Гауссе")
c = M[k, i] / M[i, i]
M[k, i:] -= c * M[i, i:]
# Обратный ход
x = np.zeros(n)
for i in range(n - 1, -1, -1):
x[i] = M[i, n]
for j in range(i + 1, n):
x[i] -= M[i, j] * x[j]
x[i] /= M[i, i]
return x
def gauss_inverse(A):
n = A.shape[0]
A_inv = np.zeros((n, n))
I = np.eye(n)
for i in range(n):
e = I[:, i]
A_inv[:, i] = gauss_solve(A, e)
return A_inv
def newton(x0, eps=1e-6, max_iter=10):
X = np.array(x0, dtype=float)
print("\nМетод Ньютона (ε = %.0e)" % eps)
print("k\t x_k\t\t y_k\t\t z_k\t\tmax|F_i(x_k)|")
for k in range(1, max_iter + 1):
Fx = F(X)
Jx = J(X)
Jinv = gauss_inverse(Jx) # обратная к Якоби
delta = -Jinv.dot(Fx)
X_new = X + delta
r_new = F(X_new)
r_max = np.max(np.abs(r_new))
print(f"{k:2d}\t{X_new[0]: .8f}\t{X_new[1]: .8f}\t"
f"{X_new[2]: .8f}\t{r_max: .2e}")
print("J(x_k) =\n", Jx)
print("J(x_k)^(-1) =\n", Jinv, "\n")
# критерий остановки по шагу
if np.max(np.abs(delta)) < eps:
print("Достигнута точность по шагу ε =", eps)
break
X = X_new
return X_new
# Тот же старт
x0 = [0.10, 0.07, 0.15]
root_newton = newton(x0)
print("\nИтог (метод Ньютона):")
print("x =", root_newton[0])
print("y =", root_newton[1])
print("z =", root_newton[2])
print("Невязки F(x):", F(root_newton))