2017-07-26 5 views
0

J'ai regardé à travers les fichiers de déclaration de la fonction de minimisation, et je suis vraiment confus quant à la façon dont la fonction fonctionne. Ainsi, par exemple, si j'ai quelque chose comme ceci:Comment exactement fonctionne la fonction de minimisation de scipy.optimize?

import numpy as np 
from scipy.integrate import quad 
from scipy.optimize import minimize 
encoderdistance = 2.53141952655 
Dx = lambda t: -3.05 * np.sin(t) 
Dy = lambda t: 2.23 * np.cos(t) 
def func(x): return np.sqrt(Dx(x)**2 + Dy(x)**2) 
print minimize(lambda x: abs(quad(func, 0, x)[0] - encoderdistance), 1).x 
print minimize(lambda x: abs(4.24561823393 - encoderdistance), 1).x 

la deuxième instruction d'impression en bas donnera un autre résultat que celui sur le dessus, même si je subbed la fonction quad pour la valeur qu'elle produit. Si cela est dû à la partie lambda x, pouvez-vous expliquer comment cela affecte exactement cette ligne de code? De plus, comment taperiez-vous l'avant-dernière ligne dans une calculatrice comme wolfram alpha? Merci!

Répondre

2

L'optimiseur a besoin d'une fonction pour minimiser - c'est ce que le lambda x: est d'environ.

Dans l'avant-dernière ligne, vous demandez à l'optimiseur de trouver une valeur de x telle que l'intégrale de 0 à x de func (x) soit proche de l'encoderdistance.

Dans la dernière ligne, la fonction à minimiser dans votre dernière ligne est juste une valeur scalaire, sans dépendance à l'égard de x, et l'optimiseur renonce car il ne peut pas changer cela.

0

Voici comment vous pouvez le faire dans Mathematica:

Dx[t_] := -3.05*Sin[t] 
Dy[t_] := 2.23*Cos[t] 
func[x_] := Sqrt[Dx[x]^2 + Dy[x]^2] 
encoderdistance = 2.53141952655; 
fmin[x_?NumberQ] := 
Abs[NIntegrate[func[t], {t, 0, x}] - encoderdistance] 
NMinimize[fmin[x], x][[2]][[1]][[2]] 

En ce qui concerne votre première question, dans la déclaration:

print minimize(lambda x: abs(4.24561823393 - encoderdistance), 1).x 

votre fonction lambda est une constante indépendante de l'argumentx. minimize se ferme immédiatement après avoir observé que la fonction ne diminue pas après plusieurs variations de l'argument.

1

Comment fonctionne est décrit here mais ce n'est pas votre problème. Vous avez deux fonctions lambda qui ne sont certainement pas les mêmes:

lambda x: abs(quad(func, 0, x)[0] - encoderdistance) 
lambda x: abs(4.24561823393 - encoderdistance) 

La première est une « fonction en V'-tandis que le second est une ligne horizontale. scipy trouve le minimum de la 'V' à environ 1,02 et ne peut effectuer aucune minimisation sur une ligne horizontale, donc il renvoie votre estimation initiale: 1.