Bonjour,
J'espère que j'ai été clair
Non. Pas du tout.
Titre de la file, message #1:
Maximisation fonction Somme de plusieurs variable
Message #3:
de loin le plus important , la
minimisation de ma fonction...
Ça la fout mal. Dans une rubrique intitulée “Calcul scientifique“, il serait de bon ton de faire preuve de plus de cohérence logique.
En premier, donc, merci de nous indiquer si tu veux minimiser la fonction ou la maximiser.
Deuxièmement, je ne vois dans ton bout de code que des instructions d’affectation, c’est à dire des instructions avec signe =.
Or pour trouver le minimum d’une fonction, il faut me semble-t-il réitérer une procédure de variation des valeurs passés comme arguments à la fonction jusqu’à trouver les valeurs qui minimisent le résultat renvoyé par la fonction, et pour cela il faut tester une condition quelque part.
Il n’y a rien de tel dans ton code.
La réitération est-elle en dehors ? Cherches tu seulement à écrire ta fonction pour le moment ?
Quelques remarques maintenant pour débroussailler:
- quelle version de Python utilises-tu ?
- pourquoi l’indentation est à 1 colonne dans la définition de la fonction et à 4 colonnes plus loin ?
- visuellement , c’est mieux d’écrire ta définition de fonction ainsi:
1 2 3 4 5
| def f(x):
for k in range (65 ,len(y)):
d += math.log( x[1] + x[2]*V_t[k-1] + x[3]*y[k-1]*y[k-1] )\
+y[k]*y[k]/( x[1] + x[2]*V_t[k-1] + x[3]*y[k-1]*y[k-1] )
return d |
- ce serait bien aimable à toi de nous dire ce que c’est que var()
- écrire
V_t[k] = omega + beta*V_t[k-1] + alpha*y[k-1]*y[k-1]
puis quelques lignes suivantes
Vol_t[k] = math.sqrt(V_t[k]*252)
ne sert qu’à brouiller le code pour un intérêt approchant de zéro.
Il vaut mieux écrire tout de suite:
Vol_t[k] = math.sqrt(( omega + beta*V_t[k-1] + alpha*y[k-1]*y[k-1] )*252)
et même
Vol_t[k] = math.sqrt(252) * math.sqrt( omega + beta*V_t[k-1] + alpha*y[k-1]*y[k-1] )
- de même:
Vol_tt[k]= math.sqrt(252) * math.sqrt( y[1+k:64+k].var() )
- deux noms V_t et V_tt : bonjour la confusion vuisuelle et les risques d’erreur quand on écrit le code !
Il faut vraiment choisir des noms plus distincts que ceux-là. M’enfin quoi ....
- les arguments doivent être passés à la fonction de la façon suivante
def f(beta,alpha,omega):
et non pas
def f( [beta,alpha,omega[ ):
comme ce à quoi revient ton écriture
- si x=[beta,alpha,omega] alors
x[1] est alpha
x[2] est omega
x[3] prdouit une erreur: index out of range
beta est x[0]
- il résulte donc qu’il faut écrire:
1 2 3 4 5
| def f(beta,alpha,omega):
for k in range (65 ,len(y)):
prov = beta + alpha*V_t[k-1] + omega*y[k-1]*y[k-1]
d += math.log(prov) + y[k]*y[k]/(prov)
return d |
si l’on se fonde sur l’ordre dans x
mais cela donne des positions de alpha, beta et omega dans l’expression qui ne sont pas les mêmes que dans le bas du code.
- il y a intérêt, au moins pour la lisibilité, et sans doute pour la rapidité de calcul, d’écrire
1 2 3 4 5
| def f(x):
for k in range (65 ,len(y)):
prov = x[1] + x[2]*V_t[k-1] + x[3]*y[k-1]*y[k-1]
d += math.log(prov) + y[k]*y[k]/(prov)
return d |
- pourquoi y a-t-il deux itérations for k in range(65,len(y)): ?
- qu’est ce que y, z, V_t, V_tt, Vol_t, Vol_tt ?
- pour
1 2
| for k in range(65,len(y)):
y[1+k:64+k] |
y[1+k:64+k] va prendre les valeurs y[66:129], [67:130], [68:131]....
Est-ce bien ce que tu veux ?
Partager