Пожалуйста, рассмотрите следующий фрагмент моего кода:
# 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 для первого решателя)?
Надеюсь, то, что я предоставил в качестве кода и объяснения, достаточно.В противном случае, дайте мне знать, что я рад вдаваться в подробности.