Задача о граничных условиях с использованием конечного метода разностейPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Задача о граничных условиях с использованием конечного метода разностей

Сообщение Anonymous »

Для решения конкретной ОДУ я использую метод конечных разностей. В сочетании с этим я использую метод Ньюона. Ниже представлена ​​проблема, которую я хотел бы решить. Ричард Л. Б. Численный анализ. Проблема в том, что мой код дает неправильные результаты. Я не знаю, в чем ошибка.
Я ожидаю получить полные результаты в таблице 11.3.
import numpy as np
import sys
a = 1
b = 2
N = 9
h = 0.1
x = np.linspace(a, b, N)
A = np.zeros((N, N))
b_vec = np.zeros(N)

A[0, 0] = 1 # y(1) = 1 b_vec[0] = 1 A[N-1, N-1] = 1 # y(2) = 2 b_vec[N-1] = 2

Preenchendo a matriz A e o vetor b

for i in range(1, N - 1): A[i, i - 1] = 1 / h2 - 1 / (2 * h * x) # Coeficiente de y_{i-1} A[i, i] = - 2 / h2 + 2 / x2 # Coeficiente de y_{i} A[i, i + 1] = 1 / h2 + 1 / (2 * h * x) # Coeficiente de y_{i+1} b_vec = np.sin(np.log(x)) / x**2 # Termo da equação

Função Newton-Raphson para encontrar as raízes

def Newton(f, dfdx, x, eps, return_x_list=False): f_value = f(x) iteration_counter = 0 if return_x_list: x_list = []

# Usamos a norma para evitar o erro com vetores
while np.linalg.norm(f_value) > eps and iteration_counter < 100:
try:
# Atualização do método de Newton com a resolução do sistema linear
delta_x = np.linalg.solve(dfdx(x), f_value)
x = x - delta_x
except np.linalg.LinAlgError:
print("Error! Singular matrix encountered at x = ", x)
sys.exit(1) # Abort with error

f_value = f(x)
iteration_counter += 1
if return_x_list:
x_list.append(x)

# Verificação de convergência
if np.linalg.norm(f_value) > eps:
iteration_counter = -1 # Falta de convergência

if return_x_list:
return x_list, iteration_counter
else:
return x, iteration_counter
def func(y):return np.dot(A, y) - b_vec
def jacobian(y):return A # O jacobiano é a matriz A no caso de equações lineares
y_guess = np.ones(N)
y_solution, iterations = Newton(func, jacobian, y_guess, 1e-6)
print("Número de iterações:", iterations)print("Valores de y:", y_solution)print("Valores de x:", x)


Подробнее здесь: https://stackoverflow.com/questions/790 ... ite-method
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»