2015-07-16 1 views
0

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?

+0

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

Répondre

1

Le problème est que tel que écrit votre lambda prend 3 arguments, pas 1 argument (qui se trouve être une séquence avec 3 éléments). Je tirerais votre fonction objectif en une fonction autonome

def signoise(w): 
    w1, w2, w3 = w # unpack your tuple into each variable 
    # populate your S and n coefficients 
    return 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 

Ensuite, vous pouvez modifier votre fonction

def opt(S1, S2, S3, n1, n2, n3): 
    xo = np.array([0,1,.01]) 
    from scipy.optimize import minimize 
    return scipy.optimize.minimize(signoise, (.4, .2, .4)) 
+0

Bon, j'ai suivi votre suggestion. 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]]) amusant: 5.1874999894628917e-18 x: array ([0.4, 0.2, 0.4]) message: 'L'optimisation s'est terminée avec succès.' jac: array ([-1.81249989e-17, -4.62499946e-17, 1.53125002e-17]) Est-ce que cette dernière ligne est le 'jac' les trois nombres que je cherchais? – hazel

+0

Pouvez-vous s'il vous plaît modifier votre question pour inclure cela? Malheureusement, tout le formatage est perdu dans la section des commentaires, il est donc difficile d'analyser visuellement cette sortie. – CoryKramer