Minimum d'une fonction
Bonjour,
j'ai du mal à trouver le min de la fonction suivante.
$$\frac{-(k+s_1)+\sqrt{(k+s_1)^2+(abU_0+x)}}{-u+\sqrt{u^2+4D(h+s_2+\nu_x-\frac{hk\nu_x}{x})} } D, \qquad\text{où}\quad\nu_x=\frac{-(k+s_1)+\sqrt{(k+s_1)^2+(abU_0+x)}}{2},$$ avec $a=0.01,\ b=800,\ s_1=s_2=1,\ U_0=1,\ k=1,\ h=0.001,\ D=0.001, \ u=1$.J'ai essayé de faire un graphe avec Google mais je pense que j'ai mélangé tous les termes de cette fonction.
Merci d'avance pour votre aide.
[Merci à Chaurien et Mister Da pour l'aide apportée dans la correction du $\LaTeX$. AD]
Réponses
-
Merci Mister Da!D est au numérateur
-
Bonjour,et c'est quoi les variables finalement ? $x$ et $u$ ?Cordialement,Mister Da
-
u=1 la variable est x
-
Bonjour
La fonction est positive ou nulle puisque le numérateur et le dénominateur sont positifs ou nuls.
Le minimum est donc $0$ si cette fonction s’annule. Or, pour $ab U_0+x=0$, elle s’annule.Le minimum est donc $0$ en $x=-a b U_0.$ -
Est-ce qu'on peut voir son graphe? J'ai essayé de le faire avec Google mais à chaque fois j'ai un graphe différent
-
Bonjour,ah ok, $u=1$ ce n'était pas précisé. Sommes-nous d'accord pour dire que le numérateur est tout simplement $2D\nu_x$ ?En m'écartant un peu de $0$ j'obtiens le graphe suivant mais j'ai programmé vite, le trait vertical est un artefact. C'est ce que tu attends ?Cordialement,Mister Da
-
S'il vous plait, dans le cas où $u=\dfrac{H^2}{2}$ où H=0.001,
-
Bonjour,voilà et j'arrête ici.Cordialement,Mister Da
-
Merci beaucoup Mister Da !Donc le min est 0.017 ! C'est le résultat auquel je m'attendais !S'il vous plaît j'aimerais savoir quel logiciel vous avez utilisé pour faire ce graphe. Ce n'est pas GeoGebra?
-
Bonjour,heuu, $0,017$ ah ?J'ai fait ça sous Matlab car c'était le logiciel qui était ouvert à ce moment là, mais tu peux faire la même chose gratuitement avec Octave, Scilab, python, libre office calc, etcCordialement,Mister Da
-
oui parce qu'on cherche le min sur les x positifs. Du coup c'est $0.017$. Vous n'êtes pas d'accord?
-
Le trait vertical étant un trait de raccord entre le dernier point d'abscisse négative et le premier d'abscisse positive, le minimum pour x>0 est nettement différent de 0,17.
-
Alors quel le min pour $x>0$?
-
Refais tracer seulement sur les positifs, puis regarde.Ça ne prouvera rien (un traceur se contente de relier des points approximativement sur la courbe), mais te donnera une idée.Cordialement.
-
Bonjour"parce qu'on cherche le min sur les x positifs"après avoir deviné la formule, après avoir deviné que $u=1$ puis finalement $H^2/2$ il aurait fallu également deviner que le domaine de définition de la fonction était $\mathbb{R}^*_+$.Bref, en traçant pour $10^{-3}\leq x\leq 0,25$ voici ce que l'on obtient.On est déjà sur des grandes valeurs de $0,017$ quand même. Numériquement je trouve $0,0177$ comme minimum.Cordialement,Mister Da
-
Le minimum sur $\mathbb R$ a été donné dans ce message de YvesM.
-
Bonjour,non le domaine de définition n'est pas $\mathbb{R}_+^*$ c'est bien $\mathbb{R}$. Mais on cherche le min pour les x positifs.C'est réglé maintenant merci beaucoup !Pour le $u$, il est constant et on compare les graphiques pour différentes valeurs de $u$, c'est pour ça que c'était $u=1$ puis $u=H/2$.S'il vous plaît, pouvez-vous poster le code du graphique ? Car j'aurai besoin des graphes pour $u=-0.5$, $u=-1$ et $u=-2$. Afin de comparer entre eux.Je vous remercie pour toute votre aide.
-
Bonjour
close all;clear all;clc; a = 0.01; b=800; s1=1; s2=1; U0=1; k=1; h=0.001; D=0.001; H = 0.001; u=H^2/2; V =@(x) (-(k+s1) + sqrt((k+s1)^2+a*b*U0+x) )/2; F =@(x) 2*D*V(x)./(-u+sqrt(u^2+4*D*(h+s2+V(x)-h*k*V(x)./x))); x = linspace(0.001,1,1000); plot(x,F(x)); grid on;
Cordialement,Mister Da -
Merci beaucoup!Je ne comprends pas la présence de @ ?Est-ce qu'on peut l'utiliser directement avec Scilab? (Je n'ai pas MatLab).Merci beaucoup encore une fois.
-
Comment adapter ce code pour qu'il fonctionne avec Scilab? Stp
-
J'ai essayé d'utiliser MatLab en ligne mais il me signale qu'il y a une erreur dans la fonction
-
Bonjour
Compte les parenthèses !!!!
D'autre part, pour tester moi-même dans Matlab, je veux bien copier/coller mais pas me taper le recopiage d'une image.
Cordialement,
Rescassol
-
Rascacolvoici le code qu'a envoyé Mister Dapar ailleurs je ne comprends pas la présence de @
-
C'est bon ca marche!Merci beaucoup! Merci infiniment pour votre aide
-
Bonjour,
Mon pseudo n'est pas "Rascacol".
Si tu recopies avec autant d'attention les codes, je comprends que tu aies des problèmes.
Cordialement,
Rescassol
-
Bonsoir
C'était l'ancienne manière de déclarer les foncions en ligne $V$ et $F$.
Avec un Matlab plus récent, ceci donne le même résultat:close all;clear all;clc; syms x a = 0.01; b=800; s1=1; s2=1; U0=1; k=1; h=0.001; D=0.001; H = 0.001; u=H^2/2; V(x)=(-(k+s1) + sqrt((k+s1)^2+a*b*U0+x) )/2; F(x)=2*D*V(x)./(-u+sqrt(u^2+4*D*(h+s2+V(x)-h*k*V(x)./x))); x = linspace(0.001,1,1000); plot(x,F(x)) grid on
Je précise que j'ai aussi la bibliothèque "Symbolic Math Toolbox".Cordialement,
Rescassol
-
Il y a longtemps que je n'avais pas fait ça, et cela a été un prétexte pour m'y remettre
Scilab dispose de modules d'optimisation pour rechercher des minimums locaux ou globaux; j'ai choisi ici la méthode de Nelder-Mead qui est une solution aux problèmes bornés.
La fonction n'est pas définie en zéro, et j'ai eu la flemme de calculer la borne inférieure en fonction des variables a, b, S1, etc; en toute rigueur il faudrait la calculer sous peine d'avoir une message du genre "optimbase_function : Type erroné de l'argument de sortie n°1 de la fonction utilisateur: Une matrice réelle attendue." quand Scilab retourne un complexe (décommenter tmp pour x=1e-7).
Le code ci-dessous permet de trouver un minimum à f=0.0177282 pour x=0.0525404mode(0); clear all; // fonction à minimiser function [f, index]=fct(x, index, a, b, s1, s2, U0, k, h, D, H, u) Vx =(-(k+s1) + sqrt((k+s1)^2+a*b*U0+x))/2; f = 2*D*Vx/(-u + sqrt(u^2 + 4*D*(h + s2 + Vx - h*k*Vx/x))); endfunction // paramètres a = 0.01; b = 800.; s1 = 1.; s2 = 1.; U0 = 1.; k = 1.; h = 0.001; D = 0.001; H = 0.001; u = H^2/2.; //x = 1e-7 //tmp = fct(x, a, b,s1, s2, U0, k, h, D, H, u) //abort // optimisation Precision = 1e-6; Valeur_initiale = [10.]; Borne_inf = [0.001]; Borne_sup = [1000.]; nm = neldermead_new (); nm = neldermead_configure(nm,"-numberofvariables",1); nm = neldermead_configure(nm,"-function",list(fct, a, b,s1, s2, U0, k, h, D, H, u)); nm = neldermead_configure(nm,"-x0",Valeur_initiale );
nm = neldermead_configure(nm,"-tolfunrelative", Precision); nm = neldermead_configure(nm,"-tolxrelative", Precision); nm = neldermead_configure(nm,"-maxiter",1000); nm = neldermead_configure(nm,"-maxfunevals",1000); nm = neldermead_configure(nm,"-boundsmin",Borne_inf); nm = neldermead_configure(nm,"-boundsmax", Borne_sup); nm = neldermead_configure(nm,"-method","box"); nm = neldermead_configure(nm,"-verbose",1); nm = neldermead_search(nm); // récupération des résultats xopt = neldermead_get(nm,"-xopt"); fopt = neldermead_get(nm,"-fopt"); nm = neldermead_destroy(nm); printf("Minimum : %g\n",xopt); printf("Valeur fonction ; %g\n",fopt); -
Bonjour,@ccapucine, si jamais tu veux faire comme paul18 pour chercher un minimum local sous Matlab avec Nelder-Mead, voici un exemple de syntaxe :
[xmin,fmin] = fminsearch(F,0.1);
où on lui demande de chercher un minimum local autour de $x=0,1$. Par défaut la tolérance est de $10^{-4}$ et on comme résultat $x_\mathrm{min} = 0,0526$ et $f_\mathrm{min} = 0,0177$.Si tu veux paramétrer avec ta variable $u$ , le mieux est de réécrire la fonction $F$ comme fonction de deux variables $x$ et $u$ d'utiliser la syntaxeu=H^2/2; [xmin,fmin] = fminsearch(@(x) F(x,u),0.1);
@Rescassol, je pense (mais je peux me planter) que ta syntaxe est propre à la bibliothèque "Symbolic Math Toolbox". Sans elle, il faut passer par le arobase pour expliquer que la variable est "muette" ou pour parler informaticien, locale à la fonction, même dans les versions récentes.Cordialement,Mister Da -
Bonsoir,
Oui, Mister Da, tu dois avoir raison pour la bibliothèque.
Si on veut, éviter l'arobase qui est une spécificité Matlab, il faut passer par des fonctions dans des fichiers séparés.
Cordialement,
Rescassol
-
Quand j'ai essayé de modifier le code Scilab (en mettant k à la place de h dans la fonction),j'ai tout de suite eu une erreur. Je ne comprends pas pourquoi.
mode(0);
clear all;
// fonction à minimiser
function [f, index]=fct(x, index, a, b, s1, s2, U0, k, h, D, H, u) Vx =(-(k+s1) + sqrt((k+s1)^2+a*b*U0+x))/2;
f = 2*D*Vx/(-u + sqrt(u^2 + 4*D*(k + s2 + Vx - k^2*Vx/x))); endfunction // paramètres
a = 0.01;
b = 800.;
s1 = 1.; s2 = 1.; U0 = 1.; k = 1.; h = 0.001;
D = 0.001; H = 0.001; u = H/2.; //x = 1e-7 //tmp = fct(x, a, b,s1, s2, U0, k, h, D, H, u) //abort // optimisation Precision = 1e-6; Valeur_initiale = [10.];
Borne_inf = [0.001]; Borne_sup = [1000.];
nm = neldermead_new ();
nm = neldermead_configure(nm,"-numberofvariables",1);
nm = neldermead_configure(nm,"-function",list(fct, a, b,s1, s2, U0, k, h, D, H, u));
nm = neldermead_configure(nm,"-x0",Valeur_initiale );
nm = neldermead_configure(nm,"-tolfunrelative", Precision);
nm = neldermead_configure(nm,"-tolxrelative", Precision);
nm = neldermead_configure(nm,"-maxiter",1000);
nm = neldermead_configure(nm,"-maxfunevals",1000);
nm = neldermead_configure(nm,"-boundsmin",Borne_inf);
nm = neldermead_configure(nm,"-boundsmax", Borne_sup);
nm = neldermead_configure(nm,"-method","box");
nm = neldermead_configure(nm,"-verbose",1);
nm = neldermead_search(nm);
// récupération des résultats xopt = neldermead_get(nm,"-xopt");
fopt = neldermead_get(nm,"-fopt");
nm = neldermead_destroy(nm);
printf("Minimum : %g\n",xopt); printf("Valeur fonction ; %g\n",fopt);
plot(x,f); -
si l'erreur mentionnée est celle de mon post ("optimbase_function : Type erroné de l'argument de sortie n°1 de la fonction utilisateur: Une matrice réelle attendue.") alors l'explication y est aussi: la valeur initiale borne inférieure est dans un domaine non-défini de la fonction et Scilab retourne un complexe (en optimisation on travaille sur des réels voire des entiers dans certains cas).
Il faut que tu définisses les domaines de validité en fonction de a, b, etc et que tu entres une borne_inf légèrement supérieure (de $10^{-3}$ par exemple).
En revanche si le nombre de variables est de 2 ou plus, il faut modifier un peu le code (voir dans la doc les exemples) -
Toujours la même flemme, avec quelques modifications mineures.
mode(0); clear all; // fonction à minimiser function [f, index]=fct(x, index, a, b, s1, s2, U0, k, h, D, H, u) Vx =(-(k+s1) + sqrt((k+s1)^2+a*b*U0+x))/2; f = 2*D*Vx/(-u + sqrt(u^2 + 4*D*(k + s2 + Vx - k^2*Vx/x))); endfunction // paramètres a = 0.01; b = 800.; s1 = 1.; s2 = 1.; U0 = 1.; k = 1.; h = 0.001; D = 0.001; H = 0.001; u = H/2.; //x = 1e-7 //tmp = fct(x, a, b,s1, s2, U0, k, h, D, H, u) //abort // optimisation Precision = 1e-6; Valeur_initiale = [10.]; Borne_inf = [1.]; Borne_sup = [1000.]; nm = neldermead_new (); nm = neldermead_configure(nm,"-numberofvariables",1); nm = neldermead_configure(nm,"-function",list(fct, a, b,s1, s2, U0, k, h, D, H, u)); nm = neldermead_configure(nm,"-x0",Valeur_initiale ); nm = neldermead_configure(nm,"-tolfunrelative", Precision); nm = neldermead_configure(nm,"-tolxrelative", Precision); nm = neldermead_configure(nm,"-maxiter",1000); nm = neldermead_configure(nm,"-maxfunevals",1000); nm = neldermead_configure(nm,"-boundsmin",Borne_inf); nm = neldermead_configure(nm,"-boundsmax", Borne_sup); nm = neldermead_configure(nm,"-method","box"); nm = neldermead_configure(nm,"-verbose",1); nm = neldermead_search(nm); // récupération des résultats xopt = neldermead_get(nm,"-xopt"); fopt = neldermead_get(nm,"-fopt"); nm = neldermead_destroy(nm); printf("Minimum : %g\n",xopt); printf("Valeur fonction ; %g\n",fopt); // function g=fct_plot(x, a, b, s1, s2, U0, k, h, D, H, u) Vx =(-(k+s1) + sqrt((k+s1)^2+a*b*U0+x))/2; g = 2*D*Vx./(-u + sqrt(u^2 + 4*D*(k + s2 + Vx- k^2*Vx./x))); endfunction x = linspace(Borne_inf, 10*Borne_inf, 1000)'; plot(x,fct_plot(x));
-
Bonjour,voici un dernier tracé de la fonction avec $0.001\leq x \leq 0.05$ et $-2\leq u \leq H^2/2$. Pour chaque $u$ fixé, on cherche le minimum de la fonction selon $x$ (j'ai utilisé la fonction fminbnd de Matlab qui permet de chercher sur tout un intervalle plutôt que fminsearch qui ne fait une recherche qu'au voisinage d'un point. Le résultat est la courbe rouge.Cordialement,Mister Da
-
Bonjour,j'ai essayé de calculer le min de la fonction modifiée qui suit avec le code de Paul, puis j'ai essayé de faire ça avec Matlabet je n'obtiens pas le même résultat$$\frac{-(k+s_1)+\sqrt{(k+s_1)^2+(abU_0+x)}}{-u+\sqrt{u^2+4D(k+s_2+\nu_x-\frac{k^2\nu_x}{x})} } D, \qquad\text{où}\quad\nu_x=\frac{-(k+s_1)+\sqrt{(k+s_1)^2+(abU_0+x)}}{2},$$ avec $a=0.01,\ b=800,\ s_1=s_2=1,\ U_0=1,\ k=1.$
-
Bonjour,vu l'avertissement il faudrait que tu vérifies le signe des quantités sous les racines carrées.Cordialement,Mister Da
-
Bonjour
Un petit bout de code Scilab qui devrait être utile pour définir automatiquement la borne inférieure du domaine d'étude (cela peut changer selon les constantes je suppose). La capture d'écran montre bien que les valeurs deviennent réelles aux alentours de $x=0.274$.
(La mémoire du précédent code n'était pas vidée, d'où des erreurs - j'ai apporté quelques modifications entre-temps)
Paul
mode(0); clear all; // ####################### // Remarques: // on démontre facilement la racine du numérateur > 0 pour tout x > 0 // idem pour Vx // Nul est la valeur qui annule le dénominateur // Val_racine => la racine du dénominateur >= 0 // Nul > Val_racine => borne inférieure = Nul // paramètres a = 0.01; b = 800.; s1 = 1.; s2 = 1.; U0 = 1.; k = 1.; h = 0.001; D = 0.001; H = 0.001; u = H/2.; // // calculs de vérification function [g, Vx]=fct_plot(x, a, b, s1, s2, U0, k, h, D, H, u) Vx =(-(k+s1) + sqrt((k+s1)^2+a*b*U0+x))/2; g = 2*D*Vx./(-u + sqrt(u^2 + 4*D*(k + s2 + Vx- k^2*Vx./x))); endfunction // Etape 1 : on supprime les valeurs complxes x = linspace(0.01, 10., 2000.)'; [g, Vx] = fct_plot(x, a, b, s1, s2, U0, k, h, D, H, u); n = size(g,'*') gprime = zeros(n) for i = 1:n gprime(i) = isreal(g(i)); end gprime = [x gprime]; index = find(gprime(:,2) == 0); gprime(index,:)= []; // Etape 2 : on définit la borne inf Borne_inf = min(gprime); x = linspace(Borne_inf, 30.*Borne_inf, 2000)'; [g, Vx] = fct_plot(x, a, b, s1, s2, U0, k, h, D, H, u); // Etape 3 : Vérification Nul = (k^2*Vx)./(k+s2+Vx); Val_racine = (k^2*Vx)./(k+s2+Vx+0.25*u^2/D); scf(1); clf; subplot(2,2,1), plot(x,g), title("g"); subplot(2,2,2), plot(x,Vx), title("Vx"); subplot(2,2,3), plot(x,Nul), title("dénominateur nul"); subplot(2,2,4), plot(x,Val_racine), title("Racine dénominateur => 0"); sda(); // ##################### // fonction à minimiser function [f, index]=fct(x, index, a, b, s1, s2, U0, k, h, D, H, u) Vx =(-(k+s1) + sqrt((k+s1)^2+a*b*U0+x))/2; f = 2*D*Vx/(-u + sqrt(u^2 + 4*D*(k + s2 + Vx - k^2*Vx/x))); endfunction // optimisation Precision = 1e-4; Valeur_initiale = [10.]; //Borne_inf = [1.]; Borne_sup = [1000.]; nm = neldermead_new (); nm = neldermead_configure(nm,"-numberofvariables",1); nm = neldermead_configure(nm,"-function",list(fct, a, b,s1, s2, U0, k, h, D, H, u)); nm = neldermead_configure(nm,"-x0",Valeur_initiale ); nm = neldermead_configure(nm,"-tolfunrelative", Precision); nm = neldermead_configure(nm,"-tolxrelative", Precision); nm = neldermead_configure(nm,"-maxiter",1000); nm = neldermead_configure(nm,"-maxfunevals",1000); nm = neldermead_configure(nm,"-boundsmin",Borne_inf); nm = neldermead_configure(nm,"-boundsmax", Borne_sup); nm = neldermead_configure(nm,"-method","box"); nm = neldermead_configure(nm,"-verbose",1); nm = neldermead_search(nm); // récupération des résultats xopt = neldermead_get(nm,"-xopt"); fopt = neldermead_get(nm,"-fopt"); nm = neldermead_destroy(nm); printf("#########\n"); printf("Minimum pour x = %g\n",xopt); printf("Valeur minimum fonction : f= %g\n",fopt); printf("###################################################\n") printf("La borne inférieure est égale à %g\n", Borne_inf); printf("###################################################\n")
-
Bonsoir,Donc, la borne inf est égale à 0.274876? S'il vous plaît
-
Du coup le min est: 0.0179 ? C'est bien ça?
-
Résumons la situation:
- j'utilise ici l'algorithme de Nelder-Mead (optimisation) pour chercher le minimum (local) d'une fonction $f$,
- il n'y a ici qu'une seule variable, mais il pourrait y en avoir plusieurs (>3)
- le problème est ici borné, c'est-à-dire qu'on restreint la recherche du minimum entre les borne_inf et borne_sup, bornes qui seront testées
- on spécifie un point de départ (valeur_initiale) et l'algorithme peut balayer l'intervalle spécifié à la recherche d'un minimum.
Le minimum de la fonction reste $f=0.017$ pour $x=1.56$.
Si tu modifies les constantes $a$, $b$, $s1$, etc (dans un certaine mesure), le programme devrait aller jusqu'à fournir un minimum sans message d'erreur.
J'espère avoir été un peu plus clair. -
Merci beaucoup pour tout!
Connectez-vous ou Inscrivez-vous pour répondre.
Bonjour!
Catégories
- 163.1K Toutes les catégories
- 8 Collège/Lycée
- 21.9K Algèbre
- 37.1K Analyse
- 6.2K Arithmétique
- 53 Catégories et structures
- 1K Combinatoire et Graphes
- 11 Sciences des données
- 5K Concours et Examens
- 11 CultureMath
- 47 Enseignement à distance
- 2.9K Fondements et Logique
- 10.3K Géométrie
- 62 Géométrie différentielle
- 1.1K Histoire des Mathématiques
- 68 Informatique théorique
- 3.8K LaTeX
- 39K Les-mathématiques
- 3.5K Livres, articles, revues, (...)
- 2.7K Logiciels pour les mathématiques
- 24 Mathématiques et finance
- 312 Mathématiques et Physique
- 4.9K Mathématiques et Société
- 3.3K Pédagogie, enseignement, orientation
- 10K Probabilités, théorie de la mesure
- 772 Shtam
- 4.2K Statistiques
- 3.7K Topologie
- 1.4K Vie du Forum et de ses membres