Нелинейный поиск корня ⇐ Python
Нелинейный поиск корня
Мне нужен стабильный нелинейный корень для функции, которая принимает два входных параметра и возвращает два нелинейных вывода в Python без библиотек «черного ящика»
Я обнаружил, что алгоритм Ньютона-Рафсона полезен, но он не всегда сходится. Затем я прочитал о BFGS, но не знал, как написать этот алгоритм с двумя входными и двумя выходными функциями, как я это сделал в Ньютон Рафсон
def root_finding(f, x0, y0, eps=1e-6, max_iter=100): """ Находит корень функции с двумя входами и двумя выходами, используя метод Ньютона-Рафсона. Параметры: f (вызываемая): функция, для которой нужно найти корень; должен принимать два входных параметра и возвращать массив из двух элементов x0 (float): начальное предположение для первого ввода y0 (float): начальное предположение для второго входа. eps (float, необязательно): допуск сходимости; итерации прекращаются, когда норма приращения меньше eps max_iter (int, необязательно): максимальное количество итераций Возврат: кортеж: корень (x, y) """ х = х0 у = у0 для меня в диапазоне (1): # Вычисляем функцию и ее якобиан при текущем приближении fxy = np.array(f(x, y)) печать (fxy) J = np.array([ [f(x + eps, y)[0] - fxy[0], f(x, y + eps)[0] - fxy[0]], [f(x + eps, y)[1] - fxy[1], f(x, y + eps)[1] - fxy[1]] ]) / eps печать (Дж) # Вычисляем приращение и обновляем предположение если np.linalg.det(J)==0: print('Матрица сингулярна') вернуть Нет, Нет дельта = np.linalg.solve(J, -fxy) х += дельта[0] у += дельта[1] #Проверяем сходимость если np.linalg.norm(дельта)
Мне нужен стабильный нелинейный корень для функции, которая принимает два входных параметра и возвращает два нелинейных вывода в Python без библиотек «черного ящика»
Я обнаружил, что алгоритм Ньютона-Рафсона полезен, но он не всегда сходится. Затем я прочитал о BFGS, но не знал, как написать этот алгоритм с двумя входными и двумя выходными функциями, как я это сделал в Ньютон Рафсон
def root_finding(f, x0, y0, eps=1e-6, max_iter=100): """ Находит корень функции с двумя входами и двумя выходами, используя метод Ньютона-Рафсона. Параметры: f (вызываемая): функция, для которой нужно найти корень; должен принимать два входных параметра и возвращать массив из двух элементов x0 (float): начальное предположение для первого ввода y0 (float): начальное предположение для второго входа. eps (float, необязательно): допуск сходимости; итерации прекращаются, когда норма приращения меньше eps max_iter (int, необязательно): максимальное количество итераций Возврат: кортеж: корень (x, y) """ х = х0 у = у0 для меня в диапазоне (1): # Вычисляем функцию и ее якобиан при текущем приближении fxy = np.array(f(x, y)) печать (fxy) J = np.array([ [f(x + eps, y)[0] - fxy[0], f(x, y + eps)[0] - fxy[0]], [f(x + eps, y)[1] - fxy[1], f(x, y + eps)[1] - fxy[1]] ]) / eps печать (Дж) # Вычисляем приращение и обновляем предположение если np.linalg.det(J)==0: print('Матрица сингулярна') вернуть Нет, Нет дельта = np.linalg.solve(J, -fxy) х += дельта[0] у += дельта[1] #Проверяем сходимость если np.linalg.norm(дельта)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Нелинейный анализ временной истории с шарнирами в качестве нулевого элемента в opensee
Anonymous » » в форуме Python - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Нелинейный анализ временной истории с шарнирами в качестве нулевого элемента в OpenSees
Anonymous » » в форуме Python - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-