J'essaie de minimiser une fonction qui a des arguments S1
, S2
, S3
et n1
, n2
et n3
. Il existe également des poids: w1
, w2
et w3
.multivariée Fonction Python SciPy
C'est la fonction:
f = (w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2)/(w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3)
Je veux savoir donné S1
, S2
, S3
, n1
, n2
et n3
, ce w1
, w2
et w3
minimisera f
?
Voici mon code à ce jour:
def opt(S1, S2, S3, n1, n2, n3):
xo = np.array([0,1,.01])
from scipy.optimize import minimize
signoise = lambda w1,w2,w3: (w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2)/(w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3)
w1min, w2min, w3min = scipy.optimize.minimize(signoise, (.4, .2, .4))
return w1min, w2min, w3min
scipy.optimize.minimize prend deux arguments, la fonction et une estimation initiale. Je ne sais pas si cela fonctionne pour les fonctions multivariables, parce que je reçois le
error : <lambda>() takes exactly 3 arguments (1 given)
D'accord, je suivais la suggestion de CodyKramer. Quand je l'ai testé avec des valeurs arbitraires pour S1, S2, S3, n1, n2, n3, j'ai obtenu tout cela comme une réponse: statut: 0 succès: vrai njev: 1 nfev: 5 hess_inv: array ([[1, 0 , 0], [0, 1, 0], [0, 0, 1]]) fun: 5.1874999894628917e-18 x: array ([0.4, 0.2, 0.4]) message: 'Optimisation terminée avec succès.' jac: array ([-1.81249989e-17, -4.62499946e-17, 1.53125002e-17]) Cette dernière ligne est-elle le "jac" les trois nombres que je cherchais?
La réponse est le tableau 'x' dans votre sortie. 'jac' est la [matrice jacobienne] (https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant) qui est la dérivée (fondamentalement) de' x', et 'hess' est la [matrice de Hesse] (https: //en.wikipedia.org/wiki/Hessian_matrix) qui est (fondamentalement) la deuxième dérivée de 'x' – CoryKramer