Ζητείται πρόγραμμα...

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

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
EneMe
Super Moderator
Δημοσιεύσεις: 13307
Εγγραφή: 09 Ιούλ 2002 13:29
Τοποθεσία: Στο κέντρο της Ελλάδας!
Επικοινωνία:

Ζητείται πρόγραμμα...

Δημοσίευση από EneMe » 04 Μαρ 2005 11:58

Καλημέρα!!! :D

Θέλω ένα πρόγραμμα που να μπορεί να δημιουργεί τον αντίστροφο ενός πίνακα nxn, για κάθε n.

Δεν με ενδιαφέρει σε ποια γλώσσα προγραμματισμού θα είναι.

Ακόμα κι αν είναι έτοιμο, δεν με πειράζει!

Απλά να είναι για οποιονδήποτε τετραγωνικό πίνακα!

Βοηθήστε τον φτωχό πλην τίμιο Super Moderator σας! :wink:

:kaloe: :kaloe: :kaloe:

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27626
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Ζητείται πρόγραμμα...

Δημοσίευση από cordis » 04 Μαρ 2005 13:28

δηλαδή αυτό
123
456
789
πως να γίνει;
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Ζητείται πρόγραμμα...

Δημοσίευση από agrippas » 04 Μαρ 2005 14:03

Δεν είναι δύσκολο να το κάνεις μόνος σου σε όποια γλώσσα κι αν το κάνεις.

Επιλογή 1 (η δύσκολη):

Πρώτα φτιάχνουμε μια συνάρτηση που βρίσκει την ορίζουσα του 2x2 πίνακα, πες det(A).

Μετά:

1. Παίρνουμε το n που είναι το πλάτος στηλών (άρα και το ύψος γραμμών) του πίνακα που θα αντιστρέψουμε.

2. Φτιάχνουμε έναν 2διάστατο array (n-1,n-1).

3. Χρησιμοποιούμε τον τύπο Α αντίστροφος = (1/det(Α))*adj(A)

Όπως καταλαβαίνεις πρέπει να καλείς τη συνάρτηση detA συνεχώς (recursion).

---

Επιλογή 2 (η εύκολη):

Κάνεις γραμμοπράξεις, κούτσα-κούτσα (με κάποια loop).

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Ζητείται πρόγραμμα...

Δημοσίευση από Rapid-eraser » 04 Μαρ 2005 14:13

vomizo dev 8elei afto ... 8elei eva tetragoviko pivaka pou
A(i,j) * 'A(i,j) = I(i,j)
opou i = j = n (gia va eivai dld tetragovikos)

apo gramiki algebra ...

exo tetoia paradigmata apo robotiki molis giriso spiti 8a sou stilo :)

Twra favtazomai oti xrisimopiises tov sosto oro kai dev 8es tov avastrofo (Traspose).

Basika eivai arketa diskolos kodikas giati prepei va breis orizousa kai meta va efarmoseis 2-3 8eorimata kai va breis tov adjoint pinaka gia amesi dimiourgia n va liseis sisitmatama taylor me texviki calei&hamilton (ta esfaksa ta ovomata to kserw :P) kai dev kserw kai egw ti allo... opos 8eorima Gause
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Ζητείται πρόγραμμα...

Δημοσίευση από Rapid-eraser » 04 Μαρ 2005 14:18

ela tixeros eisai
http://www.freevbcode.com/ShowCode.Asp?ID=6221
8a tov pareis priv ftaso spiti xaxaxaxa

ipopsiv o kodikas aftos exei eva limit 10x10 pivaka
giati meta trelevete o ipologistis apo tis prakseis kai bgevei ektos tov floating points

o kodikas pou exo egw eivai apo mathematica kai ekei dev exei problima (ektos apo xorovo :P)
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Άβαταρ μέλους
EneMe
Super Moderator
Δημοσιεύσεις: 13307
Εγγραφή: 09 Ιούλ 2002 13:29
Τοποθεσία: Στο κέντρο της Ελλάδας!
Επικοινωνία:

Ζητείται πρόγραμμα...

Δημοσίευση από EneMe » 04 Μαρ 2005 14:47

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

Έχουμε: {F}=[K]{U}

και ζητάμε: {U}=[L]{F}

Όπου ο [L] είναι ο αντίστροφος του [K], σωστά;
Δηλαδή [L] = [K]^(-1)

Τhanx Rapid, θα το τσεκάρω!

Και όποιος άλλος έχει τίποτα (με ενδιαφέρει και fortran αν ξέρετε) ας το πει!

Απλά να του το πάω και να του την πω! :P

Άβαταρ μέλους
EneMe
Super Moderator
Δημοσιεύσεις: 13307
Εγγραφή: 09 Ιούλ 2002 13:29
Τοποθεσία: Στο κέντρο της Ελλάδας!
Επικοινωνία:

Ζητείται πρόγραμμα...

Δημοσίευση από EneMe » 04 Μαρ 2005 15:08

Bρήκα αυτά!

Για κοιτάξτε, είναι σωστά;
Από Fortran παίρνω λίγο χαμπάρι...

Fortran:

Κώδικας: Επιλογή όλων

      real function inv(AA, N, Nm, Ainv)
      integer*4 N, Nm
      real*8 AA(Nm,Nm), Ainv(Nm,Nm)
! Compute inverse of matrix
! Input
!    AA   -    Matrix A (N by N)
!    N    -    Dimension of matrix A (used)
!    Nm   -    Dimension of matrix A (allocated memory)
! Outputs
!   Ainv  -    Inverse of matrix A (N by N)
!  determ -    Determinant of matrix A (return value)

      integer*4 MAXN
      parameter( MAXN = 500 )
      integer*4 i, j, k, index(MAXN), signDet, jPivot, indexJ
      real*8 scale(MAXN), b(MAXN,MAXN)   ! Scale factor and work array
      real*8 A(MAXN,MAXN)                ! Working copy of input matrix
      real*8 scalemax, ratio, ratiomax, coeff, determ, sum

      if( Nm .gt. MAXN ) then
        write(*,*) 'ERROR - Matrix is too large for inv routine'
        stop
      endif

      ! Copy matrix A so as not to modify original
      do i=1,N
        do j=1,N
          A(i,j) = AA(i,j)
        enddo
      enddo

      !* Matrix b is initialized to the identity matrix
      do i=1,N
       do j=1,N
         if( i .eq. j ) then
           b(i,j) = 1.0
         else
           b(i,j) = 0.0
         endif
       enddo
      enddo

      !* Set scale factor, scale(i) = max( |a(i,j)| ), for each row
      do i=1,N
        index(i) = i              ! Initialize row index list
        scalemax = 0.0
        do j=1,N
          if( abs(A(i,j)) .gt. scalemax ) then
            scalemax = abs(A(i,j))
          endif
        enddo
        scale(i) = scalemax
      enddo

      !* Loop over rows k = 1, ..., (N-1)
      signDet = 1
      do k=1,N-1
        !* Select pivot row from max( |a(j,k)/s(j)| )
        ratiomax = 0.0
        jPivot = k
        do i=k,N
          ratio = abs(A(index(i),k))/scale(index(i))
          if( ratio .gt. ratiomax ) then
            jPivot=i
            ratiomax = ratio
          endif
        enddo
        !* Perform pivoting using row index list
        indexJ = index(k)
        if( jPivot .ne. k ) then           ! Pivot
          indexJ = index(jPivot)
          index(jPivot) = index(k)    ! Swap index jPivot and k
          index(k) = indexJ
          signDet = -1*signDet        ! Flip sign of determinant
        endif
        !* Perform forward elimination
        do i=k+1,N
          coeff = A(index(i),k)/A(indexJ,k)
          do j=k+1,N
            A(index(i),j) = A(index(i),j) - coeff*A(indexJ,j)
          enddo
          A(index(i),k) = coeff
          do j=1,N
            b(index(i),j) = b(index(i),j) - A(index(i),k)*b(indexJ,j)
          enddo
        enddo
      enddo

      !* Compute determinant as product of diagonal elements
      determ = signDet        ! Sign of determinant
      do i=1,N
        determ = determ*A(index(i),i)
      enddo

      !* Perform backsubstitution
      do k=1,N
        Ainv(N,k) = b(index(N),k)/A(index(N),N)
        do i=N-1,1,-1
          sum = b(index(i),k)
          do j=i+1,N
            sum = sum - A(index(i),j)*Ainv(j,k)
          enddo
          Ainv(i,k) = sum/A(index(i),i)
        enddo
      enddo

      inv = determ   ! Return the determinant
      return
      end
C++:

Κώδικας: Επιλογή όλων

#include "NumMeth.h"

// Compute inverse of matrix
double inv(Matrix A, Matrix& Ainv) 
// Input
//    A    -    Matrix A (N by N)
// Outputs
//   Ainv  -    Inverse of matrix A (N by N)
//  determ -    Determinant of matrix A	(return value)
{

  int N = A.nRow();
  assert( N == A.nCol() );
  
  Ainv = A;  // Copy matrix to ensure Ainv is same size
    
  int i, j, k;
  Matrix scale(N), b(N,N);	 // Scale factor and work array
  int *index;  index = new int [N+1];

  //* Matrix b is initialized to the identity matrix
  b.set(0.0);
  for&#40; i=1; i<=N; i++ &#41;
    b&#40;i,i&#41; = 1.0;

  //* Set scale factor, scale&#40;i&#41; = max&#40; |a&#40;i,j&#41;| &#41;, for each row
  for&#40; i=1; i<=N; i++ &#41; &#123;
    index&#91;i&#93; = i;			  // Initialize row index list
    double scalemax = 0.;
    for&#40; j=1; j<=N; j++ &#41; 
      scalemax = &#40;scalemax > fabs&#40;A&#40;i,j&#41;&#41;&#41; ? scalemax &#58; fabs&#40;A&#40;i,j&#41;&#41;;
    scale&#40;i&#41; = scalemax;
  &#125;

  //* Loop over rows k = 1, ..., &#40;N-1&#41;
  int signDet = 1;
  for&#40; k=1; k<=N-1; k++ &#41; &#123;
	//* Select pivot row from max&#40; |a&#40;j,k&#41;/s&#40;j&#41;| &#41;
    double ratiomax = 0.0;
	int jPivot = k;
    for&#40; i=k; i<=N; i++ &#41; &#123;
      double ratio = fabs&#40;A&#40;index&#91;i&#93;,k&#41;&#41;/scale&#40;index&#91;i&#93;&#41;;
      if&#40; ratio > ratiomax &#41; &#123;
        jPivot=i;
        ratiomax = ratio;
      &#125;
    &#125;
	//* Perform pivoting using row index list
	int indexJ = index&#91;k&#93;;
	if&#40; jPivot != k &#41; &#123;	          // Pivot
      indexJ = index&#91;jPivot&#93;;
      index&#91;jPivot&#93; = index&#91;k&#93;;   // Swap index jPivot and k
      index&#91;k&#93; = indexJ;
	  signDet *= -1;			  // Flip sign of determinant
	&#125;
	//* Perform forward elimination
    for&#40; i=k+1; i<=N; i++ &#41; &#123;
      double coeff = A&#40;index&#91;i&#93;,k&#41;/A&#40;indexJ,k&#41;;
      for&#40; j=k+1; j<=N; j++ &#41;
        A&#40;index&#91;i&#93;,j&#41; -= coeff*A&#40;indexJ,j&#41;;
      A&#40;index&#91;i&#93;,k&#41; = coeff;
      for&#40; j=1; j<=N; j++ &#41; 
        b&#40;index&#91;i&#93;,j&#41; -= A&#40;index&#91;i&#93;,k&#41;*b&#40;indexJ,j&#41;;
    &#125;
  &#125;
  //* Compute determinant as product of diagonal elements
  double determ = signDet;	   // Sign of determinant
  for&#40; i=1; i<=N; i++ &#41;
	determ *= A&#40;index&#91;i&#93;,i&#41;;

  //* Perform backsubstitution
  for&#40; k=1; k<=N; k++ &#41; &#123;
    Ainv&#40;N,k&#41; = b&#40;index&#91;N&#93;,k&#41;/A&#40;index&#91;N&#93;,N&#41;;
    for&#40; i=N-1; i>=1; i--&#41; &#123;
      double sum = b&#40;index&#91;i&#93;,k&#41;;
      for&#40; j=i+1; j<=N; j++ &#41;
        sum -= A&#40;index&#91;i&#93;,j&#41;*Ainv&#40;j,k&#41;;
      Ainv&#40;i,k&#41; = sum/A&#40;index&#91;i&#93;,i&#41;;
    &#125;
  &#125;

  delete &#91;&#93; index;	// Release allocated memory
  return&#40; determ &#41;;        
&#125;

Απάντηση

Επιστροφή στο “γλώσσες προγραμματισμού - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες