Различные аргументы для целевой функции и якобиана с использованием sp.optimize.minimize Python - PullRequest
0 голосов
/ 19 октября 2019

Я хочу оптимизировать функцию f (x, y, z) по x с помощью sp.optimize.minimize. Якобиан зависит только от x и y, и это функция J (x, y). (это просто игрушечный пример)

Если я попытаюсь:

import numpy as np
import scipy as sp

def f(x,y,z):
  return(x**2+x*y**3+z)

def J(x,y):
  return(2*x+y**3)

x0,y,z=0,1,4
sp.optimize.minimize(f,x0,args=(y,z),jac=J)

Я получаю сообщение об ошибке «J () принимает 2 позиционных аргумента, но 3 были заданы», потому что оптимизация проходит y иот z до J.

Можно ли как-нибудь определить аргументы, которые я хочу передать f, и те, которые я хочу передать J?

(один из вариантов - определить f и J, например,что они имеют одинаковые аргументы и просто игнорируют те, которые не нужны функции, но я надеюсь, что есть более элегантный способ)

1 Ответ

2 голосов
/ 19 октября 2019

Согласно руководству , якобиан является вызываемым с подписью

J(x, *args)

Где args - это явно фиксированные параметры args=(y,z) в вашем примере. Так что нет в общем. С другой стороны, ничто не мешает вам писать:

def J(x, y, z):
  return 2*x + y**3

, и я не вижу здесь ничего "не элегантного". В общем случае мы пишем

df(x, y, z)/dx = f'(x, y, z)

в любом случае, и это справедливо для f', не зависящего от одной из переменных - мы не знаем, и никто не осуждает такого рода записи.

Если вы действительно хотите, вы можете:

def J(x, *args):
    return 2*x + args[0]**3

, чтобы скрыть дополнительные переменные. Я бы не назвал это более элегантным.

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