gtr4460 Δημοσ. 5 Αυγούστου 2009 Δημοσ. 5 Αυγούστου 2009 Γεια σας παιδία σπουδάζω και εγώ σε ένα από τα τέλεια τει αυτής της χώρας με αυτές της τρελές υποδομές πρόσβασης για τα άτομα με ειδικές ανάγκες ειρωνικά το λέω δυστυχώς είμαι άτομο με ειδικές ανάγκες έχω πρόβλημα εκ γεννηθείς κινητικό αναπηρία αλλά αυτό δεν έχει να κάνει και ένας ο πολύ ωραίος καθηγητής για να με αποφύγει για να μην του σπάω τα νεύρα επειδή δεν υπάρχει τρόπος να πάω στο μάθημα του από θέμα πρόσβασης μου έδωσε μια πολύ ωραία απαλλακτική εργασία σε ένα πολύ ωραίο μάθημα που λέγετε αρθμιμιτικι ανάλυση και μου είπε πάρε τη Μέθοδος απαλοιφής του gauss και καντιν πρόγραμμα μου έδωσε και κάτι σημειώσεις δεν καταλαβαίνεις χριστο και όταν τον ρωτάω σε τη γλώσσα μου λέει σε ότι θες εσύ μετά εγώ ρώτησα και έμαθα ότι η αρθμητικι αναλισι τρέχει σε forthran παιδία εγώ forthran δεν ξέρω δεν μας την δίδαξε και κανείς στο τει υπάρχει περίπτωση να υπάρχει κάτι έτοιμο στο net απλά να το τρέξω με ένα compiler υπάρχει άτομο που θέλει να αναλάβει τέτοια εργασία οποίος μπορεί να βοηθήσει με κάποιο τρόπο ας πει
virxen75 Δημοσ. 5 Αυγούστου 2009 Δημοσ. 5 Αυγούστου 2009 πόσταρε τις σημειώσεις που σου έδωσε να δεις για να καταλάβουμε τι ακριβώς θες. γίνεται προφανώς σε όλες τις γλώσσες οπότε διάλεξε εσύ ποια θες. ---------- Το μήνυμα προστέθηκε στις 02:37 ---------- υπάρχει πάντα και το έτοιμο....σε Visual Basic 6 http://www.vb-helper.com/howto_gaussian_elimination.html
larryf13 Δημοσ. 5 Αυγούστου 2009 Δημοσ. 5 Αυγούστου 2009 Ελπίζω να βοηθά αυτός ο κώδικας... >// Áíôß ãéá øåõäïêþäéêåò, ðáñÝ÷ïíôáé åäþ áëãüñéèìïé áñéèìçôéêÞò // ãñáììéêÞò Üëãåâñáò óå êþäéêá 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 Δημοσ. 5 Αυγούστου 2009 Δημοσ. 5 Αυγούστου 2009 σε C http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/gausselim/ ---------- Το μήνυμα προστέθηκε στις 02:40 ---------- σε java http://www.cs.princeton.edu/introcs/95linear/GaussianElimination.java.html
gtr4460 Δημοσ. 7 Αυγούστου 2009 Μέλος Δημοσ. 7 Αυγούστου 2009 Καταρχήν ευχαριστώ τα παιδία που απάντησαν Τώρα Να απαντήσω και γω virxen75 πόσταρε τις σημειώσεις που σου έδωσε να δεις για να καταλάβουμε τι ακριβώς θες edo 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
virxen75 Δημοσ. 7 Αυγούστου 2009 Δημοσ. 7 Αυγούστου 2009 για 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 σύστημα
larryf13 Δημοσ. 7 Αυγούστου 2009 Δημοσ. 7 Αυγούστου 2009 Τώρα δε μπορώ να δω καλά τι παίζει γιατί είμαι σε εξωτερικό χώρο και κλέβω ίντερνετ. Πάντως αυτός ο κώδικάς που έδωσα τον είχα δεί στη σελίδα του καθηγητή μας για την αριθμητική ανάλυση και τον πόσταρα. Τι θέλουμε ακριβώς; Να λύνει το σύστημα η να παραγοντοποιεί σε LU?
gtr4460 Δημοσ. 7 Αυγούστου 2009 Μέλος Δημοσ. 7 Αυγούστου 2009 μαλον να Να λύνει το σύστημα αφου η ασκηση δεν λεει πουθενα για παραγοντοποιηση σε lu
virxen75 Δημοσ. 7 Αυγούστου 2009 Δημοσ. 7 Αυγούστου 2009 σε γλώσσα 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"); }
virxen75 Δημοσ. 8 Αυγούστου 2009 Δημοσ. 8 Αυγούστου 2009 και πιο ολοκληρωμένο με σχόλια και έλεγχο για αοριστο ή αδύνατο σύστημα > #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 θα πάρεις λύση
we_will_rise Δημοσ. 9 Αυγούστου 2009 Δημοσ. 9 Αυγούστου 2009 Αυτό το project είχα να το υλοποιήσω σε Bash Script (Linux).. Εδώ ένας συμφοιτητής μου το έχει ανεβάσει... Καλή τύχη, εύχομαι να το κάνεις και να του μπεις στο μάτι !
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.