Probleme turbo pascal

Fermé
melissav2004 Messages postés 1 Date d'inscription dimanche 1 juin 2008 Statut Membre Dernière intervention 1 juin 2008 - 1 juin 2008 à 11:52
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 31 juil. 2008 à 17:07
Bonjour,

je n'arrive pas a différencier l'équation impossible et l'équation indéterminée.
est ce que qqun sait m'aider ds mon programme merci.

program systeme;
uses wincrt;
{Résolution de systèmes linéaires par la
méthode du pivot partie de Gauss;
on forme une matrice triangulaire supérieure }
type
matrice = array[1..3,1..3] of real;
vecteur = array[1..3] of real;
var
X,Y : vecteur;
A : matrice;
x1,x2:real;
procedure afficheSyst(A : matrice; Y : vecteur);
var
i,j : integer;
begin
for i:=1 to 3 do
begin
write(A[i,1]:0:0,' x',1);
for j:=2 to 3 do write(' + ',A[i,j]:0:0,' x',j);
writeln(' = ',Y[i]:0:0);
end;
end; { afficheSys }
procedure afficheSol(X : vecteur);
var
i : integer;
begin
for i:=1 to 3 do writeln('x',i,' = ', x[i]:0:3);
end; { afficheSol }
procedure lireVecteur(var V : vecteur);
var
i : integer;
begin
for i:=1 to 3 do
begin
write('Coordonnée ',i,' : ');
readln(V[i]);
end;
end; { lireVecteur }
procedure lireMatrice(var M : matrice);
var
i,j : integer;
begin
for i:=1 to 3 do
begin
writeln('Ligne ',i,' :');
for j:=1 to 3 do readln(M[i,j]);
end;
end; { lireMatrice }
procedure resTriangleSup(A: matrice; Y : vecteur; var X : vecteur);
var
i,j : integer;
begin
for i:=3 downto 1 do
begin
for j:=i+1 to 3 do
begin
Y[i]:=Y[i]-A[i,j]*X[j];
end;
X[i]:=Y[i]/A[i,i];
end;
end; { resTriangleSup }
procedure gaussPartiel(A : matrice; Y : vecteur; var X : vecteur);
const
presqueZero = 1e-8;
var
i,j,k,imax : integer;
max,temp, t1, t2, t3 : real;
SI : boolean;
begin
SI := false;
for i := 1 to 2 do
begin
for j := i+1 to 3 do
begin
t1 := A[i,1]/A[j,1];
t2 := A[i,2]/A[j,2];
t3 := A[i,3]/A[j,3];

if (t1 = t2) and (t2= t3) then
begin
if (Y[i] <> Y[j]*t1) then
begin
writeln ('Système impossible');
SI := true;
end;
end;
end;
end;
if (SI = false) then
begin
for k:=1 to 3 do
begin
{recherche du pivot dans la colonne k}
imax:=k; max:=abs(A[k,k]);
for i:=k+1 to 3 do
if abs(A[i,k])>max then
begin
imax:=i;
max:=abs(A[i,k]);
end;
if max<presquezero then
begin
writeln('équation indéterminée.');
halt(1);
end;
{échange de la ligne k et de la ligne imax}
for j:=k to 3 do
begin
temp:=A[k,j];
A[k,j]:=A[imax,j];
A[imax,j]:=temp;
end;
{ne pas oublier le second membre}
temp:=Y[k];
Y[k]:=Y[imax];
Y[imax]:=temp;
{élimination dans la colonne k des termes sous la ligne k}
for i:=k+1 to 3 do
begin
temp:=A[i,k]/A[k,k];
for j:=k to 3 do A[i,j]:=A[i,j]-A[k,j]*temp;
Y[i]:=Y[i]-Y[k]*temp;
end;
end;
end;
resTriangleSup(A,Y,X);
end; { gausspartiel }
begin
writeln('Entrer la matrice A.');
lireMatrice(A);
writeln;
writeln('Entrer le vecteur Y');
lireVecteur(Y);
writeln;
writeln('Voici le système avec les inconnues x1, x2, x3');
afficheSyst(A,Y);
gausspartiel(A,Y,X);
writeln;
afficheSol(X);
end.
A voir également:

4 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
31 juil. 2008 à 16:16
Voici la programmation Pascal de l'algorithme de Gauss Jordan dont je parlais plus haut.
Il permet la résolution de systèmes de n équations à n inconnues :
program GaussJordan;

const Nmax=10;

type Systeme=record
             n:integer;
             a:array[1..Nmax,1..Nmax] of real;
             b:array[1..Nmax] of real;
             end;

procedure EditerSysteme(var s:Systeme);
var i,j:integer;
begin
write('Dimension de la matrice : n=');
readln(s.n); writeln;
for i:=1 to s.n do
    begin
    writeln('Ligne ',i,' : ');
    writeln;
    for j:=1 to s.n do
        begin
        write('a[',i,',',j,']=');
        readln(s.a[i,j]);
        end;
    writeln;
    write('b[',i,']=');
    readln(s.b[i]);
    writeln;
    end;
end;

procedure Elimination_Gauss_Jordan(var s:Systeme);
var i,j,k:integer; c,d:real;
begin
for i:=1 to s.n do
    begin
    c:=s.a[i,i];
    if c=0 then begin
                writeln('Erreur : coefficient nul en ',i,'eme ligne, ',i,'eme colonne');
                writeln; exit;
                end;
    for j:=1 to s.n do
        s.a[i,j]:=s.a[i,j]/c;
    s.b[i]:=s.b[i]/c;

    for k:=1 to s.n do
        if k<>i then begin
                     d:=s.a[k,i];
                     for j:=i to s.n do
                         s.a[k,j]:=s.a[k,j]-d*s.a[i,j];
                     s.b[k]:=s.b[k]-d*s.b[i];
                     end;
    end;
end;

procedure AffichageSolution(var s:Systeme);
var i:integer;
begin
for i:=1 to s.n do
    writeln('x[',i,']=',s.b[i]);
end;

var s:Systeme;
begin
EditerSysteme(s);
Elimination_Gauss_Jordan(s);
AffichageSolution(s);
writeln; write('Fin du programme. Appuyer sur Entree'); readln;
end.
--
La confiance n'exclut pas le contrôle 
5
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
1 juin 2008 à 23:56
Je n'ai pas étudié ton code, mais il me semble que ton problème relève plus de théorie mathématiques que de programmation pascal.

Pour avoir une équation impossible il faudrait avoir plus d'équations que d'inconnues (ce que ton programme ne permet apparemment pas de faire).
Pour avoir une équation indéterminée il faudrait que plusieurs équations soit équivalentes auquel cas le déterminant de ta matrice (triangulaire donc carré) sera nul.

Finalement seuls deux cas peuvent se présenter :
Tes n équations à n inconnues sont toutes distinctes, auquel cas il existe une unique solution (cf. Cramer) et ton algorithme de Gauss devrait marcher.
Ou alors il existe au moins deux équations proportionnelles et tu auras une infinité de solution.
Mais aucun cas tu pourras avoir de solution vide si tu as autant (ou moins) d'équation que d'inconnue.

Si je m'égare en théorie et que ton problème est effectivement lié à la programmation Pascal, merci de préciser qu'est-ce que tu es censé obtenir pour chaque fonction/procédure que tu écris et expliquer un minimum le fonctionnement recherché, sinon comment savoir où sont les erreurs (ou non) de fonctionnement.
0
Bonjour,
J'ai eu des difficultés sur Turbo PAscal pour la creation de la procedure de resolution de n equation a n inconue en utilisant la methode de pivot.
Pouvez vous me donner la procedure complete de ce dernier avec explication!
Merci d'avance
0
bestkiller92 Messages postés 118 Date d'inscription mercredi 14 mai 2008 Statut Membre Dernière intervention 1 août 2008 4
31 juil. 2008 à 15:45
ouille, je savais pas que y avait encore des gens qui utilisait, le turbo pascal. vous pouvez me dre quel genre de progrmame on arrive a faire avec?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
31 juil. 2008 à 15:52
Le Turbo Pascal est encore fortement utilisé dans les milieux scolaires pour l'initiation à la programmation !
Certes c'est pas très joli, mais après on peut passer à Delphi, où là y a de quoi faire un peu mieux !

Contrairement à ce que tu as l'air de penser, le Pascal est suffisant pour tous ceux qui n'ont pas envie de passer leur vie à programmer, ou qui n'ont pas envie d'apprendre d'autres langages que ceux qu'on leur apprend...

Après bien sûr, on peut critiquer le choix du corps enseignant de se borner à l'apprentissage de l'algorithmique par le Pascal... Mais l'évolution n'est pas pour tout de suite !
0
bestkiller92 Messages postés 118 Date d'inscription mercredi 14 mai 2008 Statut Membre Dernière intervention 1 août 2008 4 > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
31 juil. 2008 à 16:52
non ma question c'était, quel genre de programme on obtien a la fin, 3D, console, ou fenetre ect...
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018 > bestkiller92 Messages postés 118 Date d'inscription mercredi 14 mai 2008 Statut Membre Dernière intervention 1 août 2008
31 juil. 2008 à 17:07
En Turbo Pascal "pur" on peut avoir un affichage console et/ou graphique.
3D je ne pense pas que ce soit possible à moins de bidouiller le mode graphique.
Avec des IDE comme Delphi ou Lazarus on peut aussi créer des fenêtres Windows avec des boutons des cases à cocher, des menus déroulants... Ce qui donne au langage Pascal un peu plus d'esthétisme...
0