Какая разница в использовании и точности fsolve, brentq и root для системы уравнений? - PullRequest
1 голос
/ 08 апреля 2019

Я задал этот вопрос Хорошо ли fsolve для какой-либо системы уравнений? , из которой я получил удовлетворительный ответ. Система, которую я там представил

x = A * exp (x + y)

y = 4 * exp (x + y)

, это просто игрушечная модель, которая похожа на мою реальную проблему, fsolve справилась (код в ответе ниже):

from scipy.optimize import fsolve
import matplotlib.pyplot as plt
import numpy as np
def f(p,*args):
  x, y = p
  A = args[0] 

  return (x -A* np.exp(x+y),y- 4* np.exp(x+y))
A = np.linspace(0,4,5)
X = []
Y =[]
for a in A:
  x,y =  fsolve(f,(0.0, 0.0) , args=(a))
  X.append(x)
  Y.append(y)
  print(x,y)

plt.plot(A,X)
plt.plot(A,Y)

Однако я читаю здесь stackoverflow.com/questions/6519380/… что brenqt намного быстрее, чем fsolve. Я пытался использовать его, но продолжаю получать f(a) and f(b) must have different signs. Я понимаю, что f must be continuous. f(a) and f(b) must have opposite signs. Итак, я считаю, brenqt не является хорошим выбором для этой системы. Пожалуйста, поправьте меня, если я ошибаюсь.

В моем реальном случае я сталкиваюсь именно с тем, что ответ здесь Как решить 3 нелинейных уравнения в Python , т. Е. "Fsolve ()) довольно чувствителен к начальным условиям", которых я хочу избежать «во-первых, минимизируйте сумму квадратов», поскольку у меня гораздо больше параметров, чем у ОП этого вопроса. Как использовать optimize.root для получения результата, аналогичного тому, который я получил с fsolve в моем исходном вопросе?

1 Ответ

0 голосов
/ 19 апреля 2019

Теперь я понимаю (благодаря комментарию выше), что brentq работает только для скалярных функций.Я нашел хорошее решение с optimize.root, и оно дает хорошее решение с некоторыми из их доступных методов, например:

def f(p,*args):
   x,y = p
   A = args[0] 
   return (x -A* np.exp(x+y),y- 4* np.exp(x+y))
A = np.linspace(0,4,5)
X = []
Y =[]
for a in A: 
   sol=optimize.root(f,[1.0,10.0],args=(a),method='lm')
   sol.message
   x,y= sol.x[0],sol.x[1]
   X.append(x)
   Y.append(y)
   print(x,y)
plt.plot(A,X)
plt.plot(A,Y)

Я все еще пытаюсь получить подходящее method для моей системы, так как решатель чрезвычайно чувствителен к нему.Например, если я использую method='broyden' в том же коде выше, я получаю совершенно другое решение.Я отправлю другой вопрос, чтобы попросить о помощи.

...