2017-08-14 1 views
0

je voudrais minimiser la fonction suivante:Minimisation avec des paramètres dans Wolfram Mathematica

enter image description here

enter image description here

enter image description here

En sortie, je veux obtenir des formules explicites pour des x:

enter image description here

Est-ce possible?

J'ai essayé de coder en Mathematica cette façon:

Minimize[{sum[(Subscript[b, i] - 
     Subscript[t, i]* 
     x1*(x2)/(x2 + x3*Subscript[c, i] + x4*Subscript[m, i] + 
      x5*Subscript[r, i] + x6*Subscript[k, i] + 
      x7*Subscript[s, i] + x8*Subscript[o, i]))^2, {i, 1, n}], 
    Subscript[a, i] > 0 && Subscript[b, i] > 0 && Subscript[c, i] >= 0 && 
    Subscript[m, i] >= 0 && Subscript[r, i] >= 0 && 
    Subscript[k, i] >= 0 && Subscript[s, i] >= 0 && 
    Subscript[o, i] >= 0 && x1 > 0 && x2 > 0 && x3 >= 0 && x4 >= 0 && 
    x5 >= 0 && x6 >= 0 && x7 >= 0 && x8 >= 0}, {x1, x2, x3, x4, x5, x6, 
    x7, x8}] 

mais il ne fonctionne pas. Tout ce que Mathematica fait est de retourner la formule ci-dessus. Que pourriez-vous recommander à ce sujet?

Répondre

1

Je ne sais pas si le code que vous avez montré ci-dessus est exactement le code que vous avez donné à Mathematica ou non. Si c'est exact, alors vous n'avez pas mis sum en majuscule et la réponse par défaut quand Mathematica ne comprend pas quelque chose est de faire écho et de rester assis là à vous regarder, espérant que vous compreniez ce que cela signifie.

Suivant. Mathematica ne supporte pas vraiment les vecteurs "abstraits", les matrices, les sommes, etc. Le faire pour additionner quelque chose avec un nombre inconnu de termes échoue généralement. Par exemple ce problème trivial

Minimize[{Sum[(Subscript[b,i] x2 + x3)^2, {i, 1, n}], 
    Subscript[b,i]>=0 && x2>0 && x3>=0}, {x2,x3}] 

echos votre entrée dans une seconde ou deux parce qu'il n'a aucune idée de ce que n est. D'un autre côté, ce problème trivial pourrait vous donner une idée de la durée pendant laquelle vous devrez peut-être attendre votre problème réel et à quoi la sortie pourrait ressembler.

n = 8; 
Minimize[{Sum[(Subscript[b,i] x2 + x3)^2, {i, 1, n}], 
    Subscript[b,i]>=0 && x2>0 && x3>=0}, {x2,x3}] 

Comme le nombre de variables monte et que les pouvoirs des variables va le temps d'exécution peut être exponentiellement plus. Dans ce cas particulier, Simplify a pu aider.

Simplify[%, Subscript[b, i] >= 0 && Subscript[b, 1] >= 0 && 
    Subscript[b, 2] >= 0 && Subscript[b, 3] >= 0 && Subscript[b, 4] >= 0 && 
    Subscript[b, 5] >= 0 && Subscript[b, 6] >= 0 && Subscript[b, 7] >= 0 && 
    Subscript[b, 8] >= 0] 

Mais plus la solution est grande, plus cela devient douteux.

Il y avait de légères différences entre votre spécification Latex et votre code. J'ai essayé de suivre le Latex. Veuillez vérifier ceci attentivement pour m'assurer que je n'ai laissé aucune erreur passer.

Vous pouvez essayer de jeter un tas de cycles à cela, peut-être quelques semaines ou un mois, et voyez ce que vous obtenez

n = 8; 
Minimize[{Sum[(Subscript[b,i]-Subscript[t,i]*x1*x2/(x2+x3*Subscript[c,i]+ 
x4*Subscript[m,i]+x5*Subscript[r,i]+x6*Subscript[k,i]+ 
x7*Subscript[s,i]+x8*Subscript[o,i]))^2, {i,1,n}], 
Subscript[b,i]>=0&&Subscript[t,i]>=0&&Subscript[c,i]>0&&Subscript[m, i]>0&& 
Subscript[r,i]>0&&Subscript[k,i]>0&&Subscript[s,i]>0&&Subscript[o,i]>0&& 
x1>0&&x2>0&&x3>=0&&x4>=0&&x5>=0&&x6>=0&&x7>=0&&x8>=0}, 
{x1,x2,x3,x4,x5,x6,x7,x8}] 

Malheureusement, je ne pense pas qu'il y ait une façon simple d'évaluer les progrès et savoir si cela se terminera dans une autre semaine ou une autre année. Si cela commence à sembler désespéré, pourriez-vous envisager une solution analytique où toutes les dérivées par xi sont nulles et voir si vous pouvez prouver que c'est vraiment un minimum?

EDIT

Je vais abuser de la notation ici. Pour ce paragraphe seulement par l'indice [b, i] je veux dire le vecteur de tous les bi, de même pour l'indice [t, i]. Et par "." Je veux dire le produit scalaire de deux vecteurs. Comprendre que:

{(x1->((Subscript[b,i].Subscript[t,i])- 
    Sqrt[(Subscript[b,i].Subscript[t,i])^2- 
    (Subscript[b,i].Subscript[b,i])(Subscript[t,i].Subscript[t,i])])/ 
    (Subscript[t,i].Subscript[t,i]) || 
x1->((Subscript[b,i].Subscript[t,i])+ 
    Sqrt[(Subscript[b,i].Subscript[t,i])^2- 
    (Subscript[b,i].Subscript[b, i]) (Subscript[t,i].Subscript[t,i])])/ 
    (Subscript[t,i].Subscript[t,i]))&& 
x2->1 && x3->0 && x4->0 && x5->0 && x6->0 && x7->0 && x8->0} 

Je crois que c'est deux solutions à votre système. Cela dépend de toutes les contraintes sur vos variables et exige en outre qu'au moins un de votre indice individuel [t, i] soit supérieur à zéro pour éviter un dénominateur nul. Et si vous connaissez bien votre algèbre linéaire, vous pourriez même en reconnaître davantage dans cette solution.

Comment ai-je trouvé ceci? J'ai deviné qu'il pourrait y avoir un minimum zéro et je suis allé chercher le plus simple que j'ai pu trouver.

Comment pouvez-vous y croire? Étudiez ce code et la solution qu'il trouve avec soin, puis généralisez le résultat à n arbitraire.

n=4; 
Simplify[Solve[Sum[(Subscript[b,i]-Subscript[t, i]*x1*x2/(x2+ 
    x3*Subscript[c,i]+x4*Subscript[m,i]+x5*Subscript[r,i]+ 
    x6*Subscript[k,i]+x7*Subscript[s,i]+x8*Subscript[o,i]))^2/. 
    {x2->1,x3->0,x4->0,x5->0,x6->0,x7->0,x8->0},{i,1,n}] == 0, x1]] 

Si vous permettez une partie ou tous x3..x8 d'être alors que non nul est un autre problème et je vais laisser cela à vous d'explorer. Je ne sais pas si l'utilisation de quelque chose de similaire à la méthode que j'ai essayé fonctionnerait pour ceux-ci ou non.

Je suis très surpris que cela a fonctionné. Je m'attendais à un problème de cette taille et avec les conditions que vous aviez, il serait impossible pour Mathematica de trouver une réponse pour vous. C'était très chanceux qu'il soit possible de rejeter presque tout votre problème et de toujours trouver une solution répondant à vos conditions.

Veuillez vérifier ceci attentivement pour m'assurer que je n'ai pas laissé passer d'erreurs.

+0

Merci de trouver une erreur! En fait, cela prend beaucoup de temps. Avez-vous des idées où puis-je dériver cette solution sous une forme générale? Je veux dire un logiciel qui peut fonctionner avec le paramètre "n" et ne nécessite pas d'être spécifique. –

+0

@Vitaliy Poletaev S'il vous plaît vérifier la modification que j'ai ajouté à mon travail précédent. – Bill