Scipy fsolve: контрольная оценка якобиана - PullRequest
0 голосов
/ 18 декабря 2018

Пожалуйста, рассмотрите следующий фрагмент моего кода:

# Execute the solver
t1 = tim.default_timer()
x = x0
nfev = 0
maxfev=3

while np.any(err**2>self.options['xtol']):
    # Calculate Jacobian
    print('Calculating Jacobian...')
    sol, inf_dict, ier, mesg = fsolve(_solve_fun_, x,args=(x_shp,),maxfev = 1,full_output = True, **self.options)
    self.jac = inf_dict['fjac']
    x = sol
    print(inf_dict['nfev'])
    nfev +=inf_dict['nfev']

    # Solve system
    print('Calculating solution...')
    sol, inf_dict, ier, mesg = fsolve(_solve_fun_, x, args=(x_shp,),fprime=self._jac_, maxfev=maxfev,full_output = True, **self.options)
    x = sol
    err = inf_dict['fvec']
    nfev += inf_dict['nfev']
    maxfev = np.min(np.array([13,maxfev+2]))

t2 = tim.default_timer()

Я системный инженер, и это часть решателя, который должен решать систему нелинейных уравнений.Проблема всегда разная (имеется в виду _solve_fun_, у меня есть система различных компонентов

, то есть труб, теплообменников, насосов и т. Д.).

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

Однако мой код работает медленнее, чем просто использование одного обычного решателя.У нас есть похожая программа в MATLAB, использующая этот «трюк» для большого эффекта.Мне не хватает ключевой разницы между MATLABs fsolve и scipys fsolve или есть способ уменьшить количество оценок функций на одну оценку Якоби (независимо от того, что я делаю nfev = 74 для первого решателя)?

Надеюсь, то, что я предоставил в качестве кода и объяснения, достаточно.В противном случае, дайте мне знать, что я рад вдаваться в подробности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...