PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : برنامه ماتريس معكوس



shirin71
08-06-2011, 08:39 PM
نوشته شده در++c

اينم برنامه ماتريس معكوس شايد براي كسي مفيد باشه
خودم نوشتم اگه يه موقع اشكال داشت ببخشيد
ضمنا كليك راست كرده و از قسمت Encoding گزينه left to right document را بزنيد.

/*Matrix Reverse */
#include <math.h>
#include <iomanip.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
int p=1;
float det(int i1,int j1,int i4,int j4,int n,float x[10][10]);
int hams(int i1,int j1,int n,float x[10][10]);
int main()
{
float x[10][10],det1,y[2][2]; int n,r=1;
cout<<"Enter n for Matrix n*n: "; cin>>n;
if(n==1) cout<<"there is not matrix.";
else {
cout<<"\nEnter "<<n*n<<" number.\n";
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>x[i][j];
det1=det(1,1,n,n,n,x);
cout<<"Determinan x is : "<<det1<<endl;
cout<<"\nMatrix Reverse Is :"<<endl;
if(n==2) { y[1][1]=x[2][2]; y[2][2]=x[1][1]; y[1][2]=-x[1][2]; y[2][1]=-x[2][1];
for(i=1;i<=2;i++)
for(int j=1;j<=2;j++) {
cout<<setw(8)<<setprecision(2)<<y[i][j]/det1;
if(j==2) cout<<endl;}}
else {
for(i=1;i<=n;i++)
for(int j=1;j<=n;j++) { cout<<setw(8)<<setprecision(2)<<(hams(j,i,n,x)/det1)*r; r*=-1;
if(j==n) cout<<endl;}} }
return 0;}
/*in ghesmat determinane x ra hesab mikonad */
float det(int i1,int j1,int i4,int j4,int n,float x[10][10]) {
if(n==2) {int i2,i3,j2,j3; i2=i1; j2=j4; i3=i4; j3=j1; return x[i1][j1]*x[i4][j4]-x[i2][j2]*x[i3][j3];}
float sum=0;
for(int k=j1;k<=j4;k++) {
if(k==j1) sum+=p*x[i1][k]*det(i1+1,j1+1,i4,j4,i4-i1,x);
else if(k==j4) sum+=p*x[i1][k]*det(i1+1,j1,i4,j4-1,i4-i1,x);
else sum+=p*x[i1][k]*det(i1+1,j1,i4,j4,i4-i1,x);
p*=-1; }
return sum; }
/* in ghesmat hamsaze x ra hesab mikonad */
int hams(int i1,int j1,int n,float x[10][10]) {
float z[10][10]; int k=1,l=1,s;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) {
if(i!=i1 && j!=j1) { z[k][l]=x[i][j];
if(l==n-1) {++k; l=0;}
++l; } }
s=det(1,1,n-1,n-1,n-1,z);
return s;}

تمام شد...

shirin71
08-06-2011, 08:40 PM
اینم یه برنامه که دترمینان رو حساب میکنه...


/*Determinan Matrix*/
#include <math.h>
#include <iomanip.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
int p=1;
float det(int i1,int j1,int i4,int j4,int n,float x[10][10]);
int main()
{
clrscr();
float x[10][10]; int n;
cout<<"Enter n for Matrix n*n: "; cin>>n; cout<<"\nEnter "<<n*n<<" number.\n";
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>x[i][j];
cout<<det(1,1,n,n,n,x);
return 0;}
float det(int i1,int j1,int i4,int j4,int n,float x[10][10]) {
if(n==2) {int i2,i3,j2,j3; i2=i1; j2=j4; i3=i4; j3=j1; return x[i1][j1]*x[i4][j4]-x[i2][j2]*x[i3][j3];}
float sum=0;
for(int k=j1;k<=j4;k++) {
if(k==j1) sum+=p*x[i1][k]*det(i1+1,j1+1,i4,j4,i4-i1,x);
else if(k==j4) sum+=p*x[i1][k]*det(i1+1,j1,i4,j4-1,i4-i1,x);
else sum+=p*x[i1][k]*det(i1+1,j1,i4,j4,i4-i1,x);
p*=-1; }
return sum; }

دترمينان به اين ترتيب عمل ميكنه كه ابتدا آرايه ها و نيازها رو خود تابع دريافت ميكنه.
در خود تابع از سطر اول عدد اول رو انتخاب و در دترمينان ماتريس بغير از سطر اول و ستون اول ضرب ميكنه
عدد انتخاب شده سه حالت داره كه يا عدد اول سطر يا عدد آخر سطر يا عدد غير از آنها كه براي هركدام مقدار ورودي تابع فرق ميكنه
و به همين ترتيب عدد دوم سطر و سوم و... تاوقتي كه ماتريس 2*2 بدست مياد
براي حساب كردنه ماتريس معكوس، ما به دترمينان و ماتريس همسازه نياز داريم كه ماتريس همسازه نيز در تابع جداگانه با نامdet و hams آمده است.

shirin71
08-06-2011, 08:40 PM
اینم توضیحات کوچولو درمورد دترمینان...

i1 : مشخصه سطر اول ماتريس j1 : مشخصه ستون اول ماتريس
i4 : مشخصه سطر آخر ماتريس j4 : مشخصه ستون آخر ماتريس
k : شمارنده حلقه for به تعداد مرتبه ماتريس ( تعداد ستونهاي ماتريس)
p : براي تغيير دادن علامت ستون زوج ماتريس . براي بدست آوردن دترمينان يكي در ميان در منفي ضرب ميشوند.

اگر مرتبه ماتريس (n) بزرگتر از 2 يعني 3يا4 يا... باشد اعداد سطر اول را در دترمينان حاصل از حذف سطر و ستون همان عدد ضرب ميكند. مثلا عدد اول سطر اول (x[i1][k] ) را برداشته و آن را در دترمينان حاصل از خذف سطر اول و ستون اول ضرب ميكند.

عددي كه برداشته ميشود 3 حالت دارد 1- اولين عدد سطر 2- آخرين عدد سطر 3- اعداد بين اول و آخر سطر

براي اولي ما بايد سطر اول و ستون اول را حذف كنيم --- i1+1 سطر دوم را جايگزين سطر اول ميكند. و j1+1 ستون دوم را جايگزين اول ميكند . سطر و ستون آخر خودشان و i4-i1 همان n جديد يعني مرتبه ماتريس منهاي يك.

براي دومي بايد سطر اول و ستون آخر را حذف كنيم .---i1+1 سطر دوم جايگزين سطر اول . --- j1 ستون اولي خودش . --- j4 سطر آخري خودش ---j4-1 ستون آخر حذف و ستون قبلي جايگزين آن ميشود.

براي سومي سطر و ستون اول و آخر تغيير نميكند فقط مرتبه ماتريس يكي كم ميشود .

اين روند ادامه پيدا ميكند تا وقتي كه مرتبه ماتريس به 2 برسد كه دتر مينان آن را به صورت دستي حساب كردم يعني جايي كه نوشته شده if (n = = 2 )


پيشنهاد ميكنم به صورت دستي روي كاغذ با نوشتن مشخصه ها و تغييرات آنها امتحان كني تا بهتر متوجه بشي.

اميدوارم توضيح مفيد بوده باشه. اگه خوب توضيح ندادم ببخشيد.