Résoudre équation du type y=f(y)

Résolu/Fermé
Scott - Modifié le 5 févr. 2021 à 18:49
 Scott - 6 févr. 2021 à 04:19
Bonjour,

Je souhaite trouver la longueur d'onde L qui rempli la condition suivante :

L=(9.81*T^2)*tanh(h*(2*pi/L));

Pour cela je crée deux L : L_1 et L_2 que je viens comparer les deux valeurs avec une boucle IF

L_1=(9.81*T^2)*tanh(h*(2*pi/L_2));

Pour ce faire je crée une boucle FOR qui vient tester différente valeur de L_2 (entre 0.1 et 200, mais dans l'idéal entre 0.1 et + l'infini).

Ensuite je teste l'égalité entre L_1 et L_2, si les deux valeurs sont égales alors L=L_2

sinon la boucle FOR recommence avec une autre valeur de L_2 et ainsi de suite.

Ce principe fonctionne très bien avec un tableau Excel mais je n'y arrive pas sur Matlab. J'ai l'impression que ma boucle FOR et IF ne fonctionne pas et je n'arrive pas à comprendre pourquoi.

Avez-vous déjà fait ce genre de boucle ? Si oui pouvez-vous m'aider s'il vous plait ?

Voici mon code :

close all %Ferme les figures
clear     %Efface les variables en mémoire
clc       %Efface le contenu de la fenêtre de commande

%Input 
h = 90; %[m] water depth
H = 1; %[m] wave height
T = 10; %[s] period 

%longueur d'onde. On prend la forme complète

for L_2=0.1:200 %0.1 est la limite basse car tanh(0) = erreur. 200 est une limite mais dans l'idéal il faudrait que la boucle aille jusqu'à l'infinie. 
        L_1=(9.81*T^2)*tanh(h*(2*pi/L_2));
        if L_1==L_2%Problème car L_1 ne sera jamais parfaitement = à L_S. Est-il possible d'ajuster les chiffres significatifs ?
           L=L_2;
        else
           L_2=L_2+0.1;%0.1 représente le pas auquel L_S progresse.
        end
end  

C = ((9.81*T)/(2*pi))*tanh((2*pi)/L);
A voir également:

2 réponses

yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 1 481
5 févr. 2021 à 20:24
bonjour,
avais-tu programmé cela dans Excel?
as-tu déjà utilisé des boucles for dans l'un ou l'autre langage?
qu'as-tu fait pour comprendre ce que faisait ton programme?
0
Salut, merci de prendre le temps de me répondre.

Déjà je voudrais m'excuser car je me suis trompé dans ma formule de L de départ donc c'est sur qu'il était impossible de trouver les mêmes résultats entre mon tableau Excel et Matlab.

Sur Excel j'ai fait un simple tableau que j'incrémente manuellement.

J'ai rechangé mon code et j'avais beaucoup d'erreurs (rien d'étonnant ahah). J'avais une boucle FOR qui ne servait à rien et ma seconde condition de ma boucle IF tournait en rond.

J'espère au moins que mes erreurs seront utiles pour que d'autres ne les fasse pas.

Voici le nouveau code qui fonctionne :

close all %Ferme les figures
clear %Efface les variables en mémoire
clc %Efface le contenu de la fenêtre de commande

%Input
h = 66; %[m] water depth
H = 1; %[m] wave height
T = 5; %[s] period

%longueur d'onde. On prend la forme complète
tol=1E-1;

L_2=0.1;%Le garder petit
L_1=((9.81*T^2)/(2*pi))*tanh(h*(2*pi/L_2));

if abs(L_1-L_2)<tol
L=L_2;
else
L_2=L_1+tol;
L_1=((9.81*T^2)/(2*pi))*tanh(h*(2*pi/L_2));
end

L=L_2;

C = ((9.81*T)/(2*pi))*tanh((2*pi)/L);

k = 2*pi/L; %[m^-1] Nombre d'onde
w = 2*pi/T; %[Hz] Fréquence

%Créaction vecteurs temps t et position x
t = 0:0.1:2*T;
x =0:0.1:2*L;

Merci encore
0
yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 1 481
5 févr. 2021 à 22:27
ton code est illisible si tu n'utilises pas les balises de code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
je ne vois pas de boucle dans ton code, je me demande ce qu'il fait.

pourras-tu, le moment venu, marquer la discussion comme résolue?
0
Scott > yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024
Modifié le 6 févr. 2021 à 04:23
Salut,

Ok effectivement c'est illisible, désolé c'est mon premier post sur un forum.

Effectivement comme tu l'a vues mon code n'a pas de boucle.
En fait je souhaiterai que tant que L_2 ne soit pas égal à L_1 (avec une tolérance = tol)
L_2 prenne la valeur de L_1
et que L_1 soit re-calculé avec cette nouvelle de L_2
Ensuite on vient interroger de nouveau si L_2 est égal à L_1 (avec une tolérance = tol)
et si non, on reboucle.

Le code illisible que j'ai écrit plus haut fait ce que je viens de dire mais que une fois, il ne boucle pas.

Cela fonctionne avec une boucle while :

while abs(L_1-L_2)>tol
L_2=L_1;
L_1=((9.81*T^2)/(2*pi))*tanh(h*2*pi/L_2); %Permet de recalculer L_1 avec la nouvelle valeur de L_2 nouvellement calculée
end


Merci de ton aide, ça m'a permis de réfléchir à ce que je faisais =)
0