Προς το περιεχόμενο

Μέθοδος απαλοιφής gauss σε fortharan η κάτι άλλο που μπορώ να το βρω στο net


gtr4460

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας παιδία σπουδάζω και εγώ σε ένα από τα τέλεια τει αυτής της χώρας

με αυτές της τρελές υποδομές πρόσβασης για τα άτομα με ειδικές ανάγκες

 

ειρωνικά το λέω δυστυχώς είμαι άτομο με ειδικές ανάγκες

έχω πρόβλημα εκ γεννηθείς κινητικό αναπηρία αλλά αυτό δεν έχει να κάνει

 

και ένας ο πολύ ωραίος καθηγητής για να με αποφύγει για να μην του σπάω

τα νεύρα επειδή δεν υπάρχει τρόπος να πάω στο μάθημα

 

του από θέμα πρόσβασης μου έδωσε μια πολύ ωραία απαλλακτική εργασία

σε ένα πολύ ωραίο μάθημα που λέγετε αρθμιμιτικι ανάλυση

 

και μου είπε πάρε τη Μέθοδος απαλοιφής του gauss και καντιν

πρόγραμμα

 

μου έδωσε και κάτι σημειώσεις δεν καταλαβαίνεις χριστο

 

και όταν τον ρωτάω σε τη γλώσσα μου λέει σε ότι θες εσύ

 

μετά εγώ ρώτησα και έμαθα ότι η αρθμητικι αναλισι

 

τρέχει σε forthran

 

παιδία εγώ forthran δεν ξέρω δεν μας την δίδαξε και κανείς στο τει

 

υπάρχει περίπτωση να υπάρχει κάτι έτοιμο στο net απλά να το τρέξω

 

με ένα compiler

 

υπάρχει άτομο που θέλει να αναλάβει τέτοια

εργασία

 

οποίος μπορεί να βοηθήσει με κάποιο

τρόπο

ας

πει

Δημοσ.

πόσταρε τις σημειώσεις που σου έδωσε να δεις

για να καταλάβουμε τι ακριβώς θες.

 

γίνεται προφανώς σε όλες τις γλώσσες οπότε διάλεξε εσύ

ποια θες.

 

---------- Το μήνυμα προστέθηκε στις 02:37 ----------

 

υπάρχει πάντα και το έτοιμο....σε Visual Basic 6

 

http://www.vb-helper.com/howto_gaussian_elimination.html

Δημοσ.

Ελπίζω να βοηθά αυτός ο κώδικας...

 

>// Áíôß ãéá øåõäïêþäéêåò, ðáñÝ÷ïíôáé åäþ áëãüñéèìïé áñéèìçôéêÞò
// ãñáììéêÞò Üëãåâñáò óå êþäéêá Scilab. Ïé óõíáñôÞóåéò áõôÝò ôñÝ÷ïõí êáé 
// óå Octave. Ôüóï ôï Scilab üóï êáé ôï Octave åßíáé ëïãéóìéêÜ åëåýèåñá êáé
// áíïéêôïý êþäéêá (âëÝðå: www.scilab.org êáé www.gnu.org áíôßóôïé÷á) ðïõ
// áíôéóôïé÷ïýí óôï åìðïñéêü Matlab. Ïé ðáñïýóåò óõíáñôÞóåéò ôñÝ÷ïõí óõíåðþò
// áõôïýóéåò êáé óôï Matlab.
//
// Ï óêïðüò ôùí óõíáñôÞóåùí äåí åßíáé í' áíôéêáôáóôÞóïõí ôéò áíôßóôïé÷åò
// åóùôåñéêÝò (êáé ðïëý êáëÜ ôåêìçñéïìÝíåò) óõíáñôÞóåéò áõôþí ôùí óõóôçìÜôùí
// áëëÜ íá óõìâÜëëïõí óôçí êáôáíüçóç ôùí áíôßóôïé÷ùí áëãïñßèìùí. 



///////////////////////////////////////////////////////////////////
// Gaussian LU factorization without permutations
// (C) A. Migdalas @ MSCC
// version 0.2

function A=GaussLU(A)

// On return, A's diagonal and upper triangular part constitutes the U factor,
// while the lower triangular part together with a diagonal of 1s
// constitutes the L factor.

// initial data check

[n,m]=size(A);
if n ~= m; error('A not square'); else

// run factorization algorithm and check for non-positiveness

for k = 1:n-1
   for i=k+1:n
      if A(k,k) == 0, error('Null pivot found. Permutations needed'); end
      A(i,k) = A(i,k)/A(k,k);
      j =[k+1:n]; A(i,j)=A(i,j)-A(i,k)*A(k,j);
   end
end
end
return
endfunction


/////////////////////////////////////////////////////////////////
// Doolittle - Croute realization of Gaussian LU factorization
// (C) A. Migdalas
// version 0.7

function [A,b]=Doolittle_Crout(A,

// On return, A's diagonal and upper triangular part constitutes the U factor,
// while the lower triangular part together with a diagonal of 1s
// constitutes the L factor.
// b contains the solution to Ax=b

// initial data check

[n,m]=size(A);
if n~=m; error('A not square'); else
  m=size(;
  if n~=m; error('b wrong size'); else

// run main algorithm and check for zero pivots

     for k=1:n
         for i=k:n
             A(k,i)=A(k,i)-A(k,1:k-1)*A(1:k-1,i);
         end
         b(k)=b(k)-A(k,1:k-1)*b(1:k-1);
         if A(k,k)==0; error('zero pivot'); return; else	
            for i=k+1:n
                A(i,k) = ( A(i,k) - A(i,1:k-1)*A(1:k-1,k) )/A(k,k);           
            end
         end
      end

// backward substitution to obtain the solution

      for k=n:-1:1
          b(k) = ( b(k) - A(k,k+1:n)*b(k+1:n) )/A(k,k)
      end
  end
end
return
endfunction


////////////////////////////////////////////////////////////////
// Cholesky factorization of symmetric positive definite matrix
// (C) A. Migdalas @ MSCC
// version 0.9

function [L,x]=Cholesky(A,

// initial checks

// is it a square system?

[n,m]=size(A);
if n~=m; error('A not square'); return; 
end
m=size(;
if n~=m; error('b of wrong size'); return; 
end

// is it a symmetric matrix?

for i=1:n-1
   if A(i,i+1:n)~=A(i+1:n,i)'; error('A asymmetric'); return;
   end
end

// initialize the lower triangular matrix

L=0.0;

// run factorization algorithm and check for non-positiveness

if A(1,1)<=0; error('not positive definite matrix ?'); return;
end
L(1,1)=sqrt( A(1,1) );
for i=2:n
   L(i,1)=A(i,1)/L(1,1);
end
for k=2:n
   pivot = A(k,k) - L(k,1:k-1)*L(k,1:k-1)' 
   if pivot <= 0; error('not positive definite matrix ?'); return; 
   end
   L(k,k)=sqrt( pivot )
   for i=k+1:n
L(i,k)= ( A(i,k) - L(i,1:k-1)*L(k,1:k-1) )/ L(k,k);
   end
end

// forward substitution

y(1)=b(1)/L(1,1);
for k=2:n
   y(k)=( b(k) - L(k,1:k-1)*y(1:k-1) )/ L(k,k);
end

// backward substitution

x(n) = y(n) / L(n,n);
for k=n-1:-1:1
   x(k) = ( y(k) - L(k+1:n,k)'*x(k+1:n))/ L(k,k);
end
return
endfunction


//////////////////////////////////////////////////////////////////
// Gaussian LU factorization of band matrix with
// bandwidths p and q. The result overwrites the
// given matrix. In the resulting A, the upper triangular
// part, including the diagonal, corresponds to U, while the
// lower triangular part, excluding the diagonal, corresponds
// to L, whose diagonal is all 1s.

// (C) A. Migdalas @ MSCC

// version 0.5

function [A] = Thomas_BandLU(A,p,q)

[n,n] = size(A);

for k = 1:n-1
   for i = k+1:min(k+p,n)
       A(i,k) = A(i,k) / A(k,k)
   end
   for j = k+1:min(k+q,n)
       for i = k+1:min(k+p,n)
            A(i,j) = A(i,j) - A(i,k) * A(k,j)
       end
   end
end
endfunction


// Solve the band system Ax=b, given the
// LU factorization obtained above

function [b] = SolveBand(A,b,p,q)

[n,n] = size(A)

// Forward substitution

for i = 1:n
   for j = i+1:min(i+p,n)
       b(j) = b(j) - A(j,i) * b(i)
   end
end

// Backward substitution

for i = n: -1: 1
   b(i) = b(i) / A(i,i);
   for j = max(1,i-q): i-1
       b(j) = b(j) - A(j,i) * b(i)
   end
end
endfunction

//////////////////////////////////////////////////////
// Modified Gram-Schmidt method for QR factorization
// (C) A. Migdalas @ MSCC
// version 0.7

function  [Q,R] = Gram_Schmidt(A)

[m,n] = size(A);

Q = zeros(m,n); Q(1:m,1) = A(1:m,1);
R = zeros(n); R(1,1) = 1;

for k = 1:n
   R(k,k) = norm( A(1:m,k) );
   Q(1:m,k) = A(1:m,k) / R(k,k);
   for j = k+1:n
       R(k,j) = Q(1:m,k)' * A(1:m,j);
       A(1:m,j) = A(1:m,j) - Q(1:m,k) * R(k,j);
   end
end
endfunction

Δημοσ.

Καταρχήν ευχαριστώ τα παιδία που απάντησαν

 

Τώρα

Να απαντήσω και γω

 

virxen75

πόσταρε

τις σημειώσεις που σου έδωσε να δεις

για να καταλάβουμε τι ακριβώς θες

 

47234435.th.jpg

 

edo

 

79550085.th.jpg

edo

 

φίλε virxen75 και larryf13 τώρα που το είδατε ποια είναι η μέθοδος απαλοιφής

του gaus είναι αυτό που μου δώσατε για λύση

 

φίλε larryf13 τον κώδικα που μου έβαλες δεν φαίνετε τα πάνω πάνω

φίλε virxen75 μου έδωσες το gaus σε c

αλλά δεν έχει #include<stdio.h>

 

δεν πρέπει να βάλλω

 

βρηκα αυτο εδω σε

forthran

 

ειναι αυτο που

ψαχνω

 

και αν ναι πως το τρεχω

πως

 

το

κανω

compailer

 

>! ---------------------PROGRAM GAUSSIAN 
! gauss.f90 
! PROGRAM OF GAUSSIAN ELIMINATION 
PARAMETER (IN=20) 
REAL:: A(IN,IN), B(IN) 
PRINT *,'INPUT NUMBER OF EQUATIONS N=' 
READ (5,*) N 
PRINT *,'INPUT MATRIX COEFFICIENTS A(I,J)=' 
READ (5,*) ((A(I,J),J=1,N),I=1,N) 
PRINT *,'INPUT RIGHT-HAND SIDE VECTOR B(I)=' 
READ (5,*) (B(I),I=1,N) 
WRITE (6,*) ('****GAUSSIAN ELIMINATION ****') 
WRITE (6,*) 
WRITE (6,*) ('COEFFICIENT MATRIX you inputed:') 
CALL PRINTA(A,IN,N,N,6) 
WRITE(6,*) 
WRITE(6,*) ('right hand side vector you inputed:') 
CALL PRINTV(B,N,6) 
WRITE(6,*) 
! CONVERT TO UPPER TRIANGULAR FORM 
DO K = 1,N-1 
IF (ABS(A(K,K)).GT.1.E-6) THEN 
DO I = K+1, N 
X = A(I,K)/A(K,K) 
DO J = K+1, N 
A(I,J) = A(I,J) -A(K,J)*X 
ENDDO 
B(I) = B(I) - B(K)*X 
ENDDO 
ELSE 
WRITE (6,*) 'ZERO PIVOT FOUND IN LINE:' 
WRITE (6,*) K 
STOP 
END IF 
ENDDO 
WRITE(6,*) 'MODIFIED MATRIX' 
CALL PRINTA(A,IN,N,N,6) 
WRITE(6,*) 
WRITE(6,*) 'MODIFIED RIGHT HAND SIDE VECTOR' 
CALL PRINTV (B,N,6) 
WRITE(6,*) 
! BACK SUBSTITUTION 
DO I = N,1,-1 
SUM = B(I) 
IF (I.LT.N) THEN 
DO J= I+1,N 
SUM = SUM - A(I,J)*B(J) 
ENDDO 
END IF 
B(I) = SUM/A(I,I) 
ENDDO 
! PRINT THE RESULTS 
write(6,*) ('SOLUTION VECTOR') 
CALL PRINTV(B,N,6) 
! 
END PROGRAM GAUSSIAN 
!------------------------------------------ 
 
SUBROUTINE PRINTA(A,IA,M,N,ICH) 
! 
! WRITE A 2D ARRAY TO OUTPUT CHANNEL 'ICH' 
! 
REAL A(IA,*) 
DO I =1,M 
WRITE(ICH,2) (A(I,J),J=1,N) 
ENDDO 
2 FORMAT(1X,6E12.4) 
! 
END SUBROUTINE PRINTA 
!----------------------------------------- 
 
SUBROUTINE PRINTV(VEC,N,ICH) 
! 
! WRITE A COLUMN VECTOR TO CHANNEL 'ICH' 
! 
REAL VEC(*) 
WRITE(ICH,1) (VEC(I),I=1,N) 
1 FORMAT(1X,6E12.4) 
! 
END SUBROUTINE PRINTV 
!----------------------------------------- 


Compiling, input data, and executing the objected code
%f90 -o run gauss.f90
%run
INPUT NUMBER OF EQUATIONS N=3
INPUT MATRIX COEFFICIENTS A(I,J)=
10.0 1.0 -5.0
-20.0 3.0 20.0
5.0 3.0 5.0
INPUT RIGHT-HAND SIDE VECTOR B(I)=1.0 2.0 6.0 
The sample of final results can be displayed as 
 **** GAUSSIAN ELIMINATION **** 
Coefficient matrix you inputed:
	.1000E+02 .1000E+01 -.5000E+01
-.2000E+02 .3000E+01 .2000E+02
.5000E+01 .3000E+01 .5000E+01
right hand side vector you inputed:
	.1000E+01 .2000E+01 .6000E+01
Modified Matrix:
	.1000E+02 .1000E+01 -.5000E+01
-.2000E+02 .5000E+01 .1000E+02
.5000E+01 .2500E+01 .2500E+01
Modified right hand side vector:
	.1000E+01 .4000E+01 .3500E+01
Solution vector:
	.1000E+01 -.2000E+01 .1400E+01 

 
If you want to input data from a file rather than key strikes, you can create a data file, say, gauss.dat: 
3
10.0 1.0 -5.0
-20.0 3.0 20.0
5.0 3.0 5.0
1.0 2.0 6.0 
Then you can use the following commands. 
%f90 -o run gauss.f90
%run<gauss.dat 
--------------------------------------------------------------------------------
Fortran 90 code for solving linear equations using Gauss-Seidel iterative method 

PROGRAM GAUSS_SEIDEL 
! Gauss-Seidel method for linear algebraic euqations 
! gauss_seidel.f90 
! 
PARAMETER (IN=50) 
REAL A(IN,IN), B(IN), X(IN), XNEW(IN), U(IN,IN) 
PRINT *,'INPUT NUMBER OF EQUATIONS N=' 
READ (5,*) N 
PRINT *,'INPUT MATRIX COEFFICIENTS A(I,J)=' 
READ (5,*) ((A(I,J),J=1,N),I=1,N) 
PRINT *,'INPUT RIGHT-HAND SIDE VECTOR B(I)=' 
READ (5,*) (B(I),I=1,N) 
WRITE(*,*) 'Input your gessed values:' 
READ(5,*) (X(I),I=1,N) 
PRINT *,'Input your tolence and max iteration:' 
READ(5,*) TOL,ITS 
WRITE(6,*) ('******Gauss-Seidel Method******') 
WRITE(6,*) 
WRITE(6,*) ('COEFFICIENT MATRIX') 
WRITE(6,*) 
CALL PRINTA(A,IN,N,N,6) 
WRITE(6,*) 
WRITE(6,*) ('RIGHT HAND VECTOR') 
WRITE(6,*) 
CALL PRINTV(B,N,6) 
WRITE(6,*) 
 
DO I=1,N 
DIAG=A(I,I) 
DO J=1,N 
A(I,J)=A(I,J)/DIAG 
ENDDO 
B(I)=B(I)/DIAG 
ENDDO 
CALL NULL(U,IN,N,N) 
DO I=1,N 
DO J=I+1,N

U(I,J)=-A(I,J) 
A(I,J)=0.0 
ENDDO 
ENDDO 

WRITE(6,*) ('FIRST FEW ITERATIONS') 
ITERS=0 
4 ITERS=ITERS+1 
CALL MVMULT(U,IN,X,N,N,XNEW) 
CALL VECADD(B,XNEW,XNEW,N) 
CALL SUBFOR(A,IN,XNEW,N) 
CALL CHECON(XNEW,X,N,TOL,ICON) 
IF (ITERS.LE.5) CALL PRINTV(X,N,6) 
IF (ICON.EQ.0.AND.ITERS.LT.ITS) GO TO 4 
WRITE(6,*) 
WRITE(6,*) ('ITERATIONS TO CONVERGENCE') 
WRITE(6,*) ITERS 
WRITE(6,*) 
WRITE(6,*) ('SOLUTION VECTOR') 
CALL PRINTV(X,N,6) 
END PROGRAM GAUSS_SEIDEL 
 
SUBROUTINE CHECON(LOADS,OLDLDS,N,TOL,ICON) 
REAL LOADS(*),OLDLDS(*) 
ICON=1 
BIG=0. 
DO I=1,N 
IF (ABS(LOADS(I)).GT.BIG) BIG=ABS(LOADS(I)) 
ENDDO 
DO I=1,N 
IF (ABS(LOADS(I)-OLDLDS(I))/BIG.GT.TOL) ICON=0 
OLDLDS(I) = LOADS(I) 
ENDDO 
END SUBROUTINE CHECON 
 
SUBROUTINE NULL(A,IA,M,N) 
REAL A(IA,*) 
DO I=1,M 
DO J=1,N 
A(I,J)=0.0 
ENDDO 
ENDDO 
END SUBROUTINE NULL 
 
SUBROUTINE PRINTA(A,IA,M,N,ICH) 
REAL A(IA,*) 
DO I=1,M 

WRITE (ICH,2) (A(I,J),J=1,N) 
ENDDO 
2 FORMAT (1X,6E12.4) 
END SUBROUTINE PRINTA 
SUBROUTINE PRINTV(VEC,N,ICH) 

REAL VEC(*) 
WRITE(ICH,1) (VEC(I),I=1,N) 
1 FORMAT (1X,6E12.4) 
END SUBROUTINE PRINTV 
 
SUBROUTINE MVMULT(M,IM,V,K,L,Y) 
REAL M(IM,*),V(*),Y(*) 
DO I=1,K 
X=0. 
DO J=1,L 
X=X+M(I,J)*V(J) 
ENDDO 
Y(I)=X 
ENDDO 
END SUBROUTINE MVMULT 
 
SUBROUTINE VECADD(A,B,C,N) 
REAL A(*),B(*),C(*) 
DO I=1,N 
C(I)=A(I)+B(I) 
ENDDO 
END SUBROUTINE VECADD 
 
SUBROUTINE SUBFOR(A,IA,B,N) 
REAL A(IA,*), B(*) 
DO I=1,N 
SUM=B(I) 
IF (I.GT.1) THEN 
DO J=1,I-1 
SUM=SUM-A(I,J)*B(J) 
ENDDO 
END IF 
B(I)=SUM/A(I,I) 
ENDDO 
END SUBROUTINE SUBFOR 
 
 
SUBROUTINE MSMULT(A,IA,C,M,N) 
REAL A(IA,*) 
DO I=1,N 
DO J=1,N 
A(I,J)=A(I,J)*C 
ENDDO 
ENDDO 
END SUBROUTINE MSMULT 

Compiling, input data, and executing the objected code 
 
%f90 -o run gauss_seidel.f90 
%run 
INPUT NUMBER OF EQUATIONS N= 
3 
INPUT MATRIX COEFFICIENTS A(I,J)= 
16 4 8 
4 5 -4 
8 -4 22 
INPUT RIGHT-HAND SIDE VECTOR B(I)= 
4 2 5 
Input your gessed values: 
1.0 1.0 1.0 
Input your tolence and max iteration: 
1.e-5 
100 
The sample of final results can be displayed as 

******Gauss-Seidel Method****** 

COEFFICIENT MATRIX 
.1600E+02 .4000E+01 .8000E+01 
.4000E+01 .5000E+01 -.4000E+01 
.8000E+01 -.4000E+01 .2200E+02 

RIGHT HAND VECTOR 
.4000E+01 .2000E+01 .5000E+01 

FIRST FEW ITERATIONS 
-.5000E+00 .1600E+01 .7000E+00 
-.5000E+00 .1360E+01 .6564E+00 
-.4182E+00 .1260E+01 .6084E+00 
-.3691E+00 .1182E+01 .5764E+00 
-.3337E+00 .1128E+01 .5537E+00 

ITERATIONS TO CONVERGENCE 
30 

SOLUTION VECTOR 
-.2500E+00 .1000E+01 .5000E+00



Δημοσ.

για C

 

>
#include <stdlib.h>
#include <stdio.h>

#define ABS(x) (x < 0 ? -(x) : (x))
#define EPS 0.00001
#define TRUE  1
#define FALSE 0
int GSolve(double **,int,double *);
void WriteSolution(double **,int,double *);

int main(int argc,char **argv)
{
  int i,n = 3;
  double x[3] = {0.0,0.0,0.0};
  double **a;

  a = (double **)malloc((n+1)*sizeof(double *));
  for (i=0;i<n+1;i++)
     a[i] = (double *)malloc(n*sizeof(double));

  a[0][0] = 1;   a[1][0] = 1;   a[2][0] = 1;  a[3][0] = 0;
  a[0][1] = 2;   a[1][1] = 1;   a[2][1] = 1;  a[3][1] = 1;
  a[0][2] = 1;   a[1][2] = 2;   a[2][2] = 1;  a[3][2] = 15;
  GSolve(a,n,x);
  WriteSolution(a,n,x);
  system("pause");
}

void WriteSolution(double **a,int n,double *x)
{
  int j,k;

  for (j=0;j<n;j++) {
     for (k=0;k<n+1;k++) {
        printf("%10.3f ",a[k][j]);
     }
     printf(" | %10.3f\n",x[j]);
  }
  printf("\n");
}

int GSolve(double **a,int n,double *x)
{
  int i,j,k,maxrow;
  double tmp;

  for (i=0;i<n;i++) {

     /* Find the row with the largest first value */
     maxrow = i;
     for (j=i+1;j<n;j++) {
        if (ABS(a[i][j]) > ABS(a[i][maxrow]))
           maxrow = j;
     }

     /* Swap the maxrow and ith row */
     for (k=i;k<n+1;k++) {
        tmp = a[k][i];
        a[k][i] = a[k][maxrow];
        a[k][maxrow] = tmp;
     }

     /* Singular matrix? */
     if (ABS(a[i][i]) < EPS)
        return(FALSE);

     /* Eliminate the ith element of the jth row */
     for (j=i+1;j<n;j++) {
        for (k=n;k>=i;k--) {
           a[k][j] -= a[k][i] * a[i][j] / a[i][i];
        }
     }
  }

  /* Do the back substitution */
  for (j=n-1;j>=0;j--) {
     tmp = 0;
     for (k=j+1;k<n;k++)
        tmp += a[k][j] * x[k];
     x[j] = (a[n][j] - tmp) / a[j][j];
  }

  return(TRUE);
}



 

 

αλλά χρειάζετε δουλειά ακόμη.

πρέπει να δίνει ο χρήστης το πλήθος των εξισώσεων και τους συντελεστές των αγνώστων

εδώ ο κώδικας αφορά ένα συγκεκριμμένο 3χ3 σύστημα

Δημοσ.

Τώρα δε μπορώ να δω καλά τι παίζει γιατί είμαι σε εξωτερικό χώρο και κλέβω ίντερνετ. Πάντως αυτός ο κώδικάς που έδωσα τον είχα δεί στη σελίδα του καθηγητή μας για την αριθμητική ανάλυση και τον πόσταρα.

 

Τι θέλουμε ακριβώς; Να λύνει το σύστημα η να παραγοντοποιεί σε LU?

Δημοσ.

σε γλώσσα C σύμφωνα με τις φωτοτυπίες που έστειλες

δεν κάνει βέβαια ελέγχους για

1)σύστημα αδύνατο

2)σύστημα αόριστο

>

#include <stdio.h>
#include <stdlib.h>

int main(){

int n;

 







printf("\ndose pli8os eksisosewn:");
scanf("%d",&n);
double *x;
x = (double *)malloc((n)*sizeof(double));
double *b;
b = (double *)malloc(n*sizeof(double));

double **a;
  a = (double **)malloc((n)*sizeof(double *));
  for (int i=0;i<n;i++)
     a[i] = (double *)malloc(n*sizeof(double));
     
     for (int i=0;i<n;i++) x[i]=0;





printf("\ndose sintelestes agnvstwn:\n");
for (int i=0;i<n;i++)
 for (int j=0;j<n;j++){
 printf(" a[%d][%d]=",(i+1),(j+1));
 scanf("%lf",&a[i][j]);
 }
 printf("\ndose sta8erous orous:");

 for (int j=0;j<n;j++){
 printf(" b[%d]=",(j+1));
 scanf("%lf",&b[j]);
 }

double m=0,s=0;

        
for (int k=0;k<n-1;k++){
   printf("\nbima=%d\n",(k+1));
 for (int i=k+1;i<n;i++){
     m=a[i][k]/a[k][k];
     printf("\n m%d%d=%5.3f/%5.3f=%5.3f",(i+1),(k+1),a[i][k],a[k][k],m);
     for (int j=k;j<n;j++){
            a[i][j]=a[i][j]-m*a[k][j];
            }
            b[i]=b[i]-m*b[k];
            printf("\n new array is \n");       
            for (int i=0;i<3;i++){
    for (int j=0;j<3;j++)
        printf(" %6.3f ",a[i][j]);
        printf("| %6.3f|",b[i]);     
        printf("\n");
        }  
            }
            }  
            
//..........
for (int i=n-1;i>=0;i--){
   s=0;
   for (int j=i+1;j<n;j++)
      s=s+a[i][j]*x[j];
      x[i]=(b[i]-s)/a[i][i];
      
}

        printf("\nresults\n");
 for (int i=0;i<3;i++) printf ("\n x%d=%6.3f ",(i+1),x[i]);

 system("pause");       
}       

Δημοσ.

και πιο ολοκληρωμένο με σχόλια και έλεγχο

για αοριστο ή αδύνατο σύστημα

 

>
#include <stdio.h>
#include <stdlib.h>

int main(){

int n;//pli8os eksisosewn
printf("\ndose pli8os eksisosewn:");
scanf("%d",&n);

double *x;//rizes sistimatos dinamika orismenos pinakas
x = (double *)malloc((n)*sizeof(double));

double *b;//sta8eroi oroi sistimatos dinamika orismenos pinakas
b = (double *)malloc(n*sizeof(double));

double **a;//sintelestes agnwstwn dinamika orismenos pinakas 2d
  a = (double **)malloc((n)*sizeof(double *));
  for (int i=0;i<n;i++)
     a[i] = (double *)malloc(n*sizeof(double));
     
     for (int i=0;i<n;i++) x[i]=0;//midenizo ton pinaka me tis rizes
//eisago apo to plhktrologio times sintelestwn agnwstvn
//ston pinaka a
printf("\ndose sintelestes agnvstwn:\n");
for (int i=0;i<n;i++)
 for (int j=0;j<n;j++){
 printf(" a[%d][%d]=",(i+1),(j+1));
 scanf("%lf",&a[i][j]);
 }
 //=================================
 
//eisago apo to plhktrologio times sta8erwn orwn
//ston pinaka b 
 printf("\ndose sta8erous orous:");
 for (int j=0;j<n;j++){
 printf(" b[%d]=",(j+1));
 scanf("%lf",&b[j]);
 }
//====================================

double m=0,s=0;
//ektelesi bimatwn algori8mou         
for (int k=0;k<n-1;k++){
   printf("\nbima=%d\n",(k+1));
 for (int i=k+1;i<n;i++){
     m=a[i][k]/a[k][k];
     printf("\n m%d%d=%5.3f/%5.3f=%5.3f",(i+1),(k+1),a[i][k],a[k][k],m);
     for (int j=k;j<n;j++){
            a[i][j]=a[i][j]-m*a[k][j];
     }
     b[i]=b[i]-m*b[k];
            //tiponei stin o8uonh ton pinaka me tis allages
            printf("\n new array is \n");       
            for (int i=0;i<3;i++){
                    for (int j=0;j<3;j++) printf(" %6.3f ",a[i][j]);
                    printf("| %6.3f|",b[i]);     
                    printf("\n");
            }  
            //========================
            
 }
}  
            
//algori8mos piso antikatastasis
for (int i=n-1;i>=0;i--){
   s=0;
   for (int j=i+1;j<n;j++)
      s=s+a[i][j]*x[j];
      x[i]=(b[i]-s)/a[i][i];
      
}
//=============================

  //elegxw an to sistima einai adynato h aoristo
  // 0 0 0 |a   an a<>0 adynato an a==0 sistima aoristo apeires liseis      
        bool adynato=false;
        bool aoristo=false;
       for (int i=0;i<n;i++){
           bool allZeroes=true;//elegxw an ola ta stoixeia tou pinaka einai miden
         for (int j=0;j<n;j++){
             if(a[i][j]!=0) allZeroes=false;
             
         } 
         if (allZeroes && b[i]!=0) adynato=true;
         if (allZeroes && b[i]==0) aoristo=true;
         }
 //apotelesmata stin o8onh        
         printf("\nresults\n");
 if (!adynato && !aoristo) for (int i=0;i<3;i++) printf ("\n x%d=%6.3f ",(i+1),x[i]);
 if (adynato) printf("\nto sistima einai adynato!!!");
 if (aoristo) printf("\nto sistima einai aoristo exei apeires liseis!!!");
//===========================

 system("pause");       
}       


 

 

βέβαια ο αλγόριθμος της φωτοτυπίας είναι ελλιπής

προϋποθέτει ότι ο πίνακας που προκύπτει από το δοθέν σύστημα βρίσκεται στην σωστή θέση

 

π.χ. ο πίνακας

 

0 1 3 |6

1 2 3 |14

1 0 2 | 7

 

δεν δίνει λύση

 

αν όμως το δώσεις

 

1 2 3 |14

0 1 3 |6

1 0 2 |7

 

θα πάρεις λύση

Δημοσ.

Αυτό το project είχα να το υλοποιήσω σε Bash Script (Linux).. Εδώ ένας συμφοιτητής μου το έχει ανεβάσει...

 

Καλή τύχη, εύχομαι να το κάνεις και να του μπεις στο μάτι !

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...