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

Επίλυση συστημάτων γραμμικών εξισώσεων με λογισμικό


zoel

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

Δημοσ.

Δεν είναι ερώτηση καθαρά προγραμματισμού, αλλά ξέρει κανείς λογισμικό για επίλυση συστημάτων γραμμικών εξισώσεων;

Δηλαδή θα περνάω στο πρόγραμμα το παρακάτω σύστημα πχ.:

 

200*x + 3*y = 2384

10* y + 28*z = 293

288*x + 89*z = 3259

 

και θα βγάζει τις λύσεις του συστήματος αν υπάρχουν.

 

Δεν ξέρω ίσως κατι σε matlab, mathcad και λοιπά αν κάνει για την δουλεία, γιαυτό χρειάζομαι να μου

υποδείξετε κάποιο συγκεκριμένο πρόγραμμα.

Ευχαριστώ για το χρόνο σας. :rolleyes:

Δημοσ.

Σωστά, το matlab μπορεί να επιλύσει γραμμικά συστήματα και πολύ εύκολα, δες εδώ για αρχή, πρώτα πρέπει να το εγκαταστήσεις και μετά ρώτα ότι θέλεις..

Δημοσ.

Ευχαριστώ παιδια για τις απαντήσεις. Προς Matlab προσανατολίζομαι, αλλά εκτός ότι δεν έχω ιδέα μου φαίνεται λίγο τεράστιο σαν πρόγραμμα :confused:. Προς το παρόν είδα ότι και το Microsoft Mathematics μπορεί να το κάνει, αλλά θέλω κάτι πιο εξεζητημένο από αυτό (το Microsoft Mathematics). Γνωρίζει κανείς αν κανένα από τα Matlab, Mathcad κλπ έχουν δυνατότητα εξόδου των αποτελεσμάτων(αλγορίθμων) σε κώδικα java ή c#;

Δημοσ.

Κάποτε, πολύ καιρό πριν, είχα δώσει μια ρουτίνα επίλυσης γραμμικών συστημάτων σε C++.

Να για μην την ψάχνεις.

 

>
/*  
      
     Gauss elimination with pivoting 
     ------------------------------- 

              V.I.Smirnov 
            --------------- 
*/ 


#include <stdio.h> 
#include <stddef.h> 
#include <stdlib.h> 
#define NR_END 1 
#define FREE_ARG char* 


void errorMessage(char error_text[]) 
{ 
       fprintf(stderr,"Run-time error...\n"); 
       fprintf(stderr,"%s\n",error_text); 
       fprintf(stderr,"...exiting to system...\n"); 
       exit(1); 
} 

int *ivector(long nl, long nh) 
{ 
  int *v; 
  v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int))); 
  if (!v) errorMessage("memory allocation 1 failure"); 
  return v-nl+NR_END; 
} 


void free_ivector(int *v, long nl, long nh) 
{ 
  free((FREE_ARG) (v+nl-NR_END)); 
} 


float **matrix(long nrl, long nrh, long ncl, long nch) 
{ 
       long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; 
       float **m; 

       /* allocate pointers to rows */ 
       m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*))); 
       if (!m) errorMessage("memory allocation 2 failure"); 
       m += NR_END; 
       m -= nrl; 

       /* allocate rows and set pointers to them */ 
       m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float))); 
       if (!m[nrl]) errorMessage("memory allocation 3 failure"); 
       m[nrl] += NR_END; 
       m[nrl] -= ncl; 

       for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; 

       /* return pointer to array of pointers to rows */ 
       return m; 
} 


void free_matrix(float **m, long nrl, long nrh, long ncl, long nch) 
{ 
       free((FREE_ARG) (m[nrl]+ncl-NR_END)); 
       free((FREE_ARG) (m+nrl-NR_END)); 
} 




#include <math.h> 
#define SWAP(a, {temp=(a);(a)=(;(=temp;} 

void GaussElimination(float **a, int n, float **b, int m) 
{ 
       int *indxc,*indxr,*ipiv; 
       int i,icol,irow,j,k,l,ll; 
       float big,dum,pivinv,temp; 

       indxc=ivector(1,n);               
       indxr=ivector(1,n); 
       ipiv=ivector(1,n); 
       for (j=1;j<=n;j++) ipiv[j]=0; 
       for (i=1;i<=n;i++) { 
               big=0.0; 
               for (j=1;j<=n;j++) 
                       if (ipiv[j] != 1) 
                               for (k=1;k<=n;k++) { 
                                       if (ipiv[k] == 0) { 
                                               if (fabs(a[j][k]) >= big) { 
                                                       big=fabs(a[j][k]); 
                                                       irow=j; 
                                                       icol=k; 
                                               } 
                                       } 
                               } 
               ++(ipiv[icol]); 
               if (irow != icol) { 
                       for (l=1;l<=n;l++) SWAP(a[irow][l],a[icol][l]) 
                       for (l=1;l<=m;l++) SWAP(b[irow][l],b[icol][l]) 
               } 
               indxr[i]=irow; 
               indxc[i]=icol; 
               if (a[icol][icol] == 0.0) errorMessage("Singular matrix encountered"); 
               pivinv=1.0/a[icol][icol]; 
               a[icol][icol]=1.0; 
               for (l=1;l<=n;l++) a[icol][l] *= pivinv; 
               for (l=1;l<=m;l++) b[icol][l] *= pivinv; 
               for (ll=1;ll<=n;ll++) 
                       if (ll != icol) { 
                               dum=a[ll][icol]; 
                               a[ll][icol]=0.0; 
                               for (l=1;l<=n;l++) a[ll][l] -= a[icol][l]*dum; 
                               for (l=1;l<=m;l++) b[ll][l] -= b[icol][l]*dum; 
                       } 
       } 
       for (l=n;l>=1;l--) { 
               if (indxr[l] != indxc[l]) 
                       for (k=1;k<=n;k++) 
                               SWAP(a[k][indxr[l]],a[k][indxc[l]]); 
       } 
       free_ivector(ipiv,1,n); 
       free_ivector(indxr,1,n); 
       free_ivector(indxc,1,n); 
} 





/* Trial of routine GaussElimination */ 

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

#define NP 20 
#define MP 20 
#define MAXSTR 80 

int main(void) 
{ 
       int j,k,l,m,n; 
       float **a,**ai,**u,**b,**x,**t; 
       char dummy[MAXSTR]; 
       FILE *fp; 

       a=matrix(1,NP,1,NP); 
       ai=matrix(1,NP,1,NP); 
       u=matrix(1,NP,1,NP); 
       b=matrix(1,NP,1,MP); 
       x=matrix(1,NP,1,MP); 
       t=matrix(1,NP,1,MP); 
       if ((fp = fopen("matrx1.txt","r")) == NULL) 
               errorMessage("Data file matrx1.txt not found\n"); 
       while (!feof(fp)) { 
               fgets(dummy,MAXSTR,fp); 
               fgets(dummy,MAXSTR,fp); 
               fscanf(fp,"%d %d ",&n,&m); 
               fgets(dummy,MAXSTR,fp); 
               for (k=1;k<=n;k++) 
                       for (l=1;l<=n;l++) fscanf(fp,"%f ",&a[k][l]); 
               fgets(dummy,MAXSTR,fp); 
               for (l=1;l<=m;l++) 
                       for (k=1;k<=n;k++) fscanf(fp,"%f ",&b[k][l]); 
               /* save matrices for later testing of results */ 
               for (l=1;l<=n;l++) { 
                       for (k=1;k<=n;k++) ai[k][l]=a[k][l]; 
                       for (k=1;k<=m;k++) x[l][k]=b[l][k]; 
               } 
               /* invert matrix */ 
               GaussElimination(ai,n,x,m); 
               printf("\nInverse of matrix a : \n"); 
               for (k=1;k<=n;k++) { 
                       for (l=1;l<=n;l++) printf("%12.6f",ai[k][l]); 
                       printf("\n"); 
               } 
               /* check inverse */ 
               printf("\na times a-inverse:\n"); 
               for (k=1;k<=n;k++) { 
                       for (l=1;l<=n;l++) { 
                               u[k][l]=0.0; 
                               for (j=1;j<=n;j++) 
                                       u[k][l] += (a[k][j]*ai[j][l]); 
                       } 
                       for (l=1;l<=n;l++) printf("%12.6f",u[k][l]); 
                       printf("\n"); 
               } 
               /* check vector solutions */ 
               printf("\nCheck the following for equality:\n"); 
               printf("%21s %14s\n","original","matrix*sol'n"); 
               for (l=1;l<=m;l++) { 
                       printf("vector %2d: \n",l); 
                       for (k=1;k<=n;k++) { 
                               t[k][l]=0.0; 
                               for (j=1;j<=n;j++) 
                                       t[k][l] += (a[k][j]*x[j][l]); 
                               printf("%8s %12.6f %12.6f\n"," ", 
                                       b[k][l],t[k][l]); 
                       } 
               } 
               printf("***********************************\n"); 
               printf("press RETURN for next problem:\n"); 
               (void) getchar(); 
       } 
       fclose(fp); 
       free_matrix(t,1,NP,1,MP); 
       free_matrix(x,1,NP,1,MP); 
       free_matrix(b,1,NP,1,MP); 
       free_matrix(u,1,NP,1,NP); 
       free_matrix(ai,1,NP,1,NP); 
       free_matrix(a,1,NP,1,NP); 
       return 0; 
}

 

Γράψε σε ένα txt αρχείο με όνομα matrx1.txt κάποιους δοκιμαστικούς πίνακες Α και Β για να τρέξει η main και να λύσει τα συστήματα.

Να, κάτι τέτοιο :

 

>MATRICES FOR INPUT TO TEST ROUTINES 
Size of matrix (NxN), Number of solutions: 
3 2 
Matrix A: 
1.0 0.0 0.0 
0.0 2.0 0.0 
0.0 0.0 3.0 
Solution vectors: 
1.0 0.0 0.0 
1.0 1.0 1.0 
NEXT PROBLEM 
Size of matrix (NxN), Number of solutions: 
3 2 
Matrix A: 
1.0 2.0 3.0 
2.0 2.0 3.0 
3.0 3.0 3.0 
Solution vectors: 
1.0 1.0 1.0 
1.0 2.0 3.0 
NEXT PROBLEM: 
Size of matrix (NxN), Number of solutions: 
5 2 
Matrix A: 
1.0 2.0 3.0 4.0 5.0 
2.0 3.0 4.0 5.0 1.0 
3.0 4.0 5.0 1.0 2.0 
4.0 5.0 1.0 2.0 3.0 
5.0 1.0 2.0 3.0 4.0 
Solution vectors: 
1.0 1.0 1.0 1.0 1.0 
1.0 2.0 3.0 4.0 5.0 
NEXT PROBLEM: 
Size of matrix (NxN), Number of solutions: 
5 2 
Matrix A: 
1.4 2.1 2.1 7.4 9.6 
1.6 1.5 1.1 0.7 5.0 
3.8 8.0 9.6 5.4 8.8 
4.6 8.2 8.4 0.4 8.0 
2.6 2.9 0.1 9.6 7.7 
Solution vectors: 
1.1 1.6 4.7 9.1 0.1 
4.0 9.3 8.4 0.4 4.1

 

Η ρουτίνα αυτή λειτουργεί μόνον για πραγματικούς και κάνει πλήρες pivoting.

Αν θέλεις και μιγαδικούς μπορώ να σου δώσω μια παρόμοια σε fortran (είναι μισή σε έκταση,

πιο περιεκτική και δείχνει σαφέστερα την εφαρμογή του αλγόριθμου από αυτήν εδώ - fortran γαρ !).

 

Έχω γράψει και αντίστοιχη που λύνει ένα γραμμικό σύστημα ΣΥΜΒΟΛΙΚΑ αλλά δεν σκοπεύω να δώσω τον κώδικα...

 

-

Δημοσ.

Κάποτε, πολύ καιρό πριν, είχα δώσει μια ρουτίνα επίλυσης γραμμικών συστημάτων σε C++.

-

Ειναι C, οχι C++ :shifty:

Οπως και να χει μπραβο, καλη σπαζοκεφαλια ο G.E.

Δημοσ.

Για γραμμικά και μη γραμμικά συστήματα έχω ανακαλύψει μια μέθοδο που μας δίνει τις λύσεις ενός συστήματος αν υπάρχουν περισσότερες από μια. Επίσης λύνει και μη γραμμικά προβλήματα της επιχειρησιακής έρευνας που περιέχουν και συνθήκες με ανισώσεις.

 

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

 

>
x1*x1   - x1*x2 + x2*x2   =  19
2*x1*x1 + x1*x2 - 3*x2*x2 = -25


Έξοδος Προγράμματος
Τρόπος έρευνας  : RANDOM
Nο εκκινήσεων   : 15
eps             : 1E-015
Αρχική ενίσχυση : 3
H0              : 1452.930091414601
Start time      : 20:50:26
End time        : 20:50:26

Λύσεις του συστήματος:
x1            x2           ob
2.000000     -3.000000    0.00000000 [1.40E-26]
3.670652      4.817730    0.00000000 [1.69E-27]
-2.000000      3.000000    0.00000000 [2.08E-26]
-3.670652     -4.817730    0.00000000 [1.77E-27]

και ενδεχόμενα μέγιστα ή ελάχιστα ή σημεία μη αλγοριθμικής σύγκλισης:
x1            x2             ob
-3633.366822  -3490.296414   675881462282343.60000000 [6.76E+14] *


Τρόπος Έρευνας  : NON-RANDOM
Nο εκκινήσεων   : 20
eps             : 1E-015
Αρχική ενίσχυση : 3
H0              : 1500
Hfin            : 90
Βήμα μείωσης    : 70.5
Start time      : 20:52:09
End time        : 20:52:10

Λύσεις του συστήματος:
x1            x2           ob
2.000000     -3.000000    0.00000000 [2.09E-26]
3.670652      4.817730    0.00000000 [1.67E-27]
-2.000000      3.000000    0.00000000 [1.39E-26]
-3.670652     -4.817730    0.00000000 [2.52E-27]

και ενδεχόμενα μέγιστα ή ελάχιστα ή σημεία μη αλγοριθμικής σύγκλισης:
x1            x2             ob

  • 1 μήνα μετά...
Δημοσ.

παιδιά υπάρχει τίποτα - κανένα πρόγραμμα που να λύνει ασκήσεις για τα μαθηματικά?

Παράγωγοι-Συναρτήσεις 1/πολλών μεταβλητών - όρια

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

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

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