zoel Δημοσ. 15 Ιουλίου 2011 Δημοσ. 15 Ιουλίου 2011 Δεν είναι ερώτηση καθαρά προγραμματισμού, αλλά ξέρει κανείς λογισμικό για επίλυση συστημάτων γραμμικών εξισώσεων; Δηλαδή θα περνάω στο πρόγραμμα το παρακάτω σύστημα πχ.: 200*x + 3*y = 2384 10* y + 28*z = 293 288*x + 89*z = 3259 και θα βγάζει τις λύσεις του συστήματος αν υπάρχουν. Δεν ξέρω ίσως κατι σε matlab, mathcad και λοιπά αν κάνει για την δουλεία, γιαυτό χρειάζομαι να μου υποδείξετε κάποιο συγκεκριμένο πρόγραμμα. Ευχαριστώ για το χρόνο σας.
kagelos Δημοσ. 15 Ιουλίου 2011 Δημοσ. 15 Ιουλίου 2011 Αν ενδιαφέρεσαι για αλγόριθμο που το κάνει πάντως, ένας είναι το Gaussian elimination. Πολύ απλός στην υλοποίησή του.
Technology fan Δημοσ. 15 Ιουλίου 2011 Δημοσ. 15 Ιουλίου 2011 Σωστά, το matlab μπορεί να επιλύσει γραμμικά συστήματα και πολύ εύκολα, δες εδώ για αρχή, πρώτα πρέπει να το εγκαταστήσεις και μετά ρώτα ότι θέλεις..
zoel Δημοσ. 15 Ιουλίου 2011 Μέλος Δημοσ. 15 Ιουλίου 2011 Ευχαριστώ παιδια για τις απαντήσεις. Προς Matlab προσανατολίζομαι, αλλά εκτός ότι δεν έχω ιδέα μου φαίνεται λίγο τεράστιο σαν πρόγραμμα . Προς το παρόν είδα ότι και το Microsoft Mathematics μπορεί να το κάνει, αλλά θέλω κάτι πιο εξεζητημένο από αυτό (το Microsoft Mathematics). Γνωρίζει κανείς αν κανένα από τα Matlab, Mathcad κλπ έχουν δυνατότητα εξόδου των αποτελεσμάτων(αλγορίθμων) σε κώδικα java ή c#;
V.I.Smirnov Δημοσ. 15 Ιουλίου 2011 Δημοσ. 15 Ιουλίου 2011 Κάποτε, πολύ καιρό πριν, είχα δώσει μια ρουτίνα επίλυσης γραμμικών συστημάτων σε 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 γαρ !). Έχω γράψει και αντίστοιχη που λύνει ένα γραμμικό σύστημα ΣΥΜΒΟΛΙΚΑ αλλά δεν σκοπεύω να δώσω τον κώδικα... -
nilosgr Δημοσ. 16 Ιουλίου 2011 Δημοσ. 16 Ιουλίου 2011 Κάποτε, πολύ καιρό πριν, είχα δώσει μια ρουτίνα επίλυσης γραμμικών συστημάτων σε C++. - Ειναι C, οχι C++ Οπως και να χει μπραβο, καλη σπαζοκεφαλια ο G.E.
adamco Δημοσ. 16 Ιουλίου 2011 Δημοσ. 16 Ιουλίου 2011 Για γραμμικά και μη γραμμικά συστήματα έχω ανακαλύψει μια μέθοδο που μας δίνει τις λύσεις ενός συστήματος αν υπάρχουν περισσότερες από μια. Επίσης λύνει και μη γραμμικά προβλήματα της επιχειρησιακής έρευνας που περιέχουν και συνθήκες με ανισώσεις. Το παρακάτω μη γραμμικό σύστημα 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
adamco Δημοσ. 17 Αυγούστου 2011 Δημοσ. 17 Αυγούστου 2011 wow!!!! Έλυσα τα παραδείγματα της πατέντας US 7,587,375 B2 (Sep. 8, 2009) με την μέθοδό μου. Να την κατοχυρώσω και εγώ με δίπλωμα ευρεσιτεχνίας;
Adawn Δημοσ. 17 Αυγούστου 2011 Δημοσ. 17 Αυγούστου 2011 παιδιά υπάρχει τίποτα - κανένα πρόγραμμα που να λύνει ασκήσεις για τα μαθηματικά? Παράγωγοι-Συναρτήσεις 1/πολλών μεταβλητών - όρια
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.