1/ Recherche de solutions (approchées) d'équations du type f(x) = 0. Méthode dichotomique.
Méthode applicable à une fonction f continue monotone sur I = [a;b], avec f(a)*f(b) < 0 (f(a) et f(b) sont de signes contraires).
Méthode basée sur le théorème des valeurs intermédiaires : Comme f(a) et f(b) sont de signes contraires, f s'annule entre a et b.
On s'intéresse alors au milieu de l'intervalle
c = (a + b) / 2.
Soit f(c) est du même signe que f(a), on recommence alors avec l'intervalle [c, b]
Soit f(c) est du signe de f(b), on recommence alors avec l'intervalle [a,c]
Soit exceptionnellement, f(c) = 0, c'est fini, c'est OK.
Comme à chaque étape, la longueur de l'intervalle est divisée par 2, le moment va arriver où la longueur de l'intervalle va être inférieure à la précision cherchée epsilon, nous aurons la valeur de la solution de l'équation à epsilon près.
Ecrire une procédure dichotomie qui, à partir d'un intervalle [a;b] et d'une précision epsilon, vérifie si la méthode est applicable (a < b et f(a)*f(b) <0), et si c'est le cas rend x, la solution de l'équation f(x) = 0 (f supposée monotone sur l'intervalle)
J'ai pensé pour la programmation normale à un schéma itératif Tantque.
Tantque f(c) non égal à 0, faire
Si f(c) (Ici, il faudrait peut-être créer une fonction booléene TRUTH, qui rende VRAI si f(c) est du signe de a et FAUX si f(c) est du signe de b, non ?) TRUTH
Alors a:= c
Sinon b:=c
Fintantque
Je sais qu'il faut d'autres paramètres, qu'il faut définir et tout ça. Pourriez-vous m'aider à rédiger cette procédure en langage normal et en langage pascal, s'il vous plaît ?
Je vous remercie d'avance
BONNE JOURNEE ET BON COURAGE
" Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.
petite erreur:
qui rende VRAI si f(c) est du signe de f(a)
Il me semble que tu as oublié c=(a+b)/2 juste avant FinTantque
Mesurer la masse de la situation permettrait de connaitre sa gravité :)
21/04/2008 - 23h56
Gell-Müller
Date d'inscription
mars 2008
Localisation
Nouméa, Nouvelle-Calédonie
Âge
22
Messages
42
Re : Projet informatique pour le lundi 5 mai !!!
Effectivement...
" Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.
22/04/2008 - 07h17
SuperTux
Date d'inscription
septembre 2007
Messages
661
Re : Projet informatique pour le lundi 5 mai !!!
Salut,
Tu as de la chance, comme j'ai trouvé le problème intéressant, je l'ai codé en C. En analysant le code source tu devrais pouvoir facilement comprendre comment cela marche.
Attention par contre, la dichotomie ne marchera que sur une fonction monotone.
Code:
#include <stdio.h>
double absolute(double x)
{
if(x < 0)
{
x = x * -1.0;
}
return x;
}
double f(double x)
{
return (x * 2.0) + 5.0; // f(x) -> 2x+5
}
int test(double a, double b)
{
if((a > b) || ((f(a) * f(b)) > 0))
{
return 0;
}
return 1;
}
double dicho(double a, double b, double ep)
{
double c;
do
{
c = b - ((b - a) / 2);
if(f(c) < 0)
{
a = c;
}
else
{
b = c;
}
}
while((absolute(f(c)) - ep) > 0);
return c;
}
int main()
{
double r;
if(test(-20.0, 10.0) == 1)
{
r = dicho(-20.0, 10.0, 0.1);
printf("f(%f) = %f\n", r, f(r));
}
if(test(-100.0, -1.0) == 1)
{
r = dicho(-100.0, -1.0, 0.1);
printf("f(%f) = %f\n", r, f(r));
}
if(test(0.0, 10.0) == 1) // Ne passe pas le test, f(a) * f(b) > 0
{
r = dicho(0.0, 10.0, 0.1);
printf("f(%f) = %f\n", r, f(r));
}
return 0;
}
27/04/2008 - 23h37
Gell-Müller
Date d'inscription
mars 2008
Localisation
Nouméa, Nouvelle-Calédonie
Âge
22
Messages
42
Re : Projet informatique pour le lundi 5 mai !!!
Code:
program ZERODEFONCTION;
uses WinCrt;
procedure DICHOTOMIE;
var X,INF, SUP, MILIEUINT, SOLUTION, EPS : real;
Begin
MILIEUINT:= (INF + SUP) / 2;
If INF < SUP and (((sqr(INF)-1))*((sqr(SUP)-1))) < 0;
Then begin
While (sqr(MILIEUINT)-1) <> 0 do
If sqr(MILIEUINT) < 0
Then begin
INF:= MILIEUINT;
end
Else begin
SUP:= MILIEUINT;
end;
SOLUTION:= MILIEUINT;
Writeln('LE ZERO DE LA FONCTION SE SITUE AU POINT D''ABSCISSE X = ',SOLUTION);
end;
Else begin
Writeln('LE ZERO DE LA FONCTION NE SE TROUVE PAS DANS CET INTERVALLE !!!');
end;
end.
Tout ce programme est le programme PASCAL que j'ai rédigé. Mais, il y a une erreur quelque part... Je ne sais pas pourquoi. Dois-je créer la fonction x²-1 ou non.
Il y a aussi un deuxième exercice dans le projet.
2/ Les flottants
On peut représenter un nombre décimal d par deux entiers appelés mantisse et exposant de telle façon que
d = mantisse * 10^(exposant). Dans cet exercice on se limitera à la base 10.
a) Construire un type flottant capable de représenter un nombre décimal par 2 entiers.
J'ai pensé à un type composé de mantisse et d'exposant (mantisse étant de type réel et exposant de type entier).
Est-ce exact ?
b) Ecrire une procédure qui étant donné deux flottants d1 et d2 renvoie un autre flottant représentant le produit d1*d2
Et là je dois avouer que je suis coincé. Comment faire ?
c) Ecrire une fonction puissance qui à partir d'un entier x et d'un entier positif n renvoie l'entier x^n.
d) En utilisant la fonction puissance, écrire la procédure qui à partir de 2 flottants d1 et d2 renvoie un autre flottant représentant la somme d1+d2
Pour les deux derniers, je suis coincé...
P.S : Pour ln, exp et les fonctions trigonométriques, ce sont des fonctions prédéfinies dans Turbo-Pascal, c'est OK !!!
MERCI D'AVANCE...
BON COURAGE ET BONNE JOURNEE
retour au forum
Pour la 2/c), j'ai fait le programme PASCAL suivant qui s'éxécute normalement, mais il posséde un défaut majeur
Code:
program POWER;
uses WINCRT;
var NOMBRE, FORCE, PUISSANCENOMBRE : integer;
function PUISSANCE(X,n,SOLUTION:integer):integer;
var i,AUX : integer;
begin
AUX:= X;
While i < n do
SOLUTION := X*AUX;
X:= SOLUTION;
i:= i+1;
end;
begin
Writeln('Bienvenue dans le programme PUISSANCE D"UN NOMBRE !!!');
Writeln('Nombre a multiplier : ');
Read(NOMBRE);
Writeln('Combien de fois dois-je multiplier ce nombre ? : ');
Read(FORCE);
If FORCE <= 0
Then begin
IF FORCE < 0
Then begin
Writeln('CE NOMBRE NE DOIT EN AUCUN CAS ETRE NEGATIF !!!');
Writeln('Saisissez un nombre positif ou nul !!!');
end
ELSE BEGIN
PUISSANCENOMBRE := 1;
Writeln(NOMBRE ,' à la puissance', FORCE, ' donne : ',PUISSANCENOMBRE);
end;
end
Else begin
PUISSANCENOMBRE:= PUISSANCE(NOMBRE,FORCE,PUISSANCENOMBRE);
Writeln(NOMBRE, ' à la puissance ', FORCE, ' donne : ',PUISSANCENOMBRE);
end;
end.
Pour lui, 5² = 4672
Qu'est-ce que je dois changer? Et pourriez-vous m'aider, s'il vous plaît ?
Merci d'avance...
Dernière modification par yoda1234 ; 28/04/2008 à 06h40.
Motif: Ajout de balises
" Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.
Est ce qu'en pascal les variable sont initialisées à la déclaration ?
car VAR i
puis
While i < n do
si i n'est pas égal à 0 au départ ça donnera nimporte quoi
c'est ce qui se passerait dans le langage C++, i aurai une valeur aléatoire.
Mesurer la masse de la situation permettrait de connaitre sa gravité :)
29/04/2008 - 00h22
Gell-Müller
Date d'inscription
mars 2008
Localisation
Nouméa, Nouvelle-Calédonie
Âge
22
Messages
42
Re : Projet informatique pour le lundi 5 mai !!!
Effectivement, j'ai oublier d'initialiser i = 0. Mais, j'ai un autre problème maintenant. Le programme fonctionne jusqu'à ce que je lui demande d'effectuer le calcul. C'est là qu'il se met à ne plus répondre.
Qu'est-ce qui pourrait ne pas aller correctement ?
Serait-ce un dépassement de capacité ???
MERCI D'AVANCE ET MERCI BEAUCOUP
BONNE JOURNEE ET BON COURAGE
" Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.
29/04/2008 - 00h26
Gell-Müller
Date d'inscription
mars 2008
Localisation
Nouméa, Nouvelle-Calédonie
Âge
22
Messages
42
Re : Projet informatique pour le lundi 5 mai !!!
Comment analyse-t-on un code source pour le faire passer du C au Java ???
" Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.
29/04/2008 - 07h58
Gell-Müller
Date d'inscription
mars 2008
Localisation
Nouméa, Nouvelle-Calédonie
Âge
22
Messages
42
Re : Projet informatique pour le lundi 5 mai !!!
Voici le premier programme :
Code:
program POWER;
uses WINCRT;
var NOMBRE, FORCE, PUISSANCENOMBRE : integer;
function PUISSANCE(X,n,SOLUTION:integer):integer;
var i,AUX : integer;
begin
i:= 0;
SOLUTION:=1;
AUX:= X;
While i < n do
begin
Writeln('La vie est belle');
SOLUTION :=SOlUTION * x;
i:= i+1;
end;
end;
Code:
begin
Writeln('Bienvenue dans le programme PUISSANCE D"UN NOMBRE !!!');
Writeln('Nombre à multiplier : ');
Read(NOMBRE);
Writeln('Combien de fois dois-je multiplier ce nombre ? : ');
Read(FORCE);
If FORCE <= 0
Then begin
IF FORCE < 0
Then begin
Writeln('CE NOMBRE NE DOIT EN AUCUN CAS ETRE NEGATIF !!!');
Writeln('Saisissez un nombre positif ou nul !!!');
end
Else begin
PUISSANCENOMBRE := 1;
Writeln(NOMBRE ,' à la puissance', FORCE, ' donne : ',PUISSANCENOMBRE);
end;
end
Else begin
PUISSANCENOMBRE:= PUISSANCE(NOMBRE,FORCE,PUISSANCENOMBRE);
Writeln(NOMBRE, ' à la puissance ', FORCE, ' donne : ',PUISSANCENOMBRE);
end;
end.
Juste un problème : POURQUOI J'OBTIENS DES VALEURS "spaces" comme :
5² = 4671 ; 3² = 4671... Enfin je peux mettre n'importe quel x ou n, x^n vaut toujours 4671... QUE SE PASSE-T-IL DONC ???
Merci d'avance pour votre aide...
BONNE JOURNEE ET BON COURAGE
Dernière modification par yoda1234 ; 29/04/2008 à 11h01.
" Il est plus difficile de désagréger un préjugé qu'un atome." Albert Einstein.
29/04/2008 - 11h07
yoda1234
Date d'inscription
août 2004
Localisation
dagobah
Messages
13 025
Re : Projet informatique pour le lundi 5 mai !!!
Merci d'utiliser les balises à ta disposition et dans ton cas la balise code .
Là où l'ignorance est un bienfait, c'est de la folie d'être sage (Thomas Gray).
29/04/2008 - 12h35
Gaara
Date d'inscription
février 2007
Localisation
Val d'Oise
Âge
23
Messages
904
Re : Projet informatique pour le lundi 5 mai !!!
Salut,
je ne prétends pas être un pro mais je te propose çà :
Remplace la variable PUISSANCENOMBRE par PUISSANCENBR juste pour voir..
A+
=)
Et enfin on plaît aux filles... D'abord on houuhouuhouu <3
02/05/2008 - 06h35
badboy.nc
Date d'inscription
mai 2008
Âge
25
Messages
1
Re : Projet informatique pour le lundi 5 mai !!!
Salut Einstein, alors comme ça on veut avoir des info!!!!
bon ben je te laisse.
PS: L'université de Nouvelle Calédonie n'admet que "Tape Touche" dans ces salle INFO et non "counter strike" ....
A lundi Einstein....
03/05/2008 - 00h18
Gaara
Date d'inscription
février 2007
Localisation
Val d'Oise
Âge
23
Messages
904
Re : Projet informatique pour le lundi 5 mai !!!
Envoyé par badboy.nc
Salut Einstein, alors comme ça on veut avoir des info!!!!
bon ben je te laisse.
PS: L'université de Nouvelle Calédonie n'admet que "Tape Touche" dans ces salle INFO et non "counter strike" ....
A lundi Einstein....
HS non ?
Et enfin on plaît aux filles... D'abord on houuhouuhouu <3