نمایش نتایج: از شماره 1 تا 3 , از مجموع 3

موضوع: برنامه ماتريس معكوس

  1. #1
    عضو سایت
    گاه برای ساختن باید ویران کرد، گاه برای داشتن باید گذشت ، و گاه در اوج تمنا باید نخواست!
    تاریخ عضویت
    Jun 2011
    محل سکونت
    یک خانه
    نوشته ها
    25,040
    تشکر تشکر کرده 
    3,527
    تشکر تشکر شده 
    5,275
    تشکر شده در
    3,184 پست
    حالت من : Akhmoo
    قدرت امتیاز دهی
    4451
    Array

    برنامه ماتريس معكوس

    نوشته شده در++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;}

    تمام شد...
    [دل خوش از آنیم که حج میرویم؟ ..]
    غافل از آنیم که کج میرویم



    [SIGPIC][/SIGPIC]


  2. #2
    عضو سایت
    گاه برای ساختن باید ویران کرد، گاه برای داشتن باید گذشت ، و گاه در اوج تمنا باید نخواست!
    تاریخ عضویت
    Jun 2011
    محل سکونت
    یک خانه
    نوشته ها
    25,040
    تشکر تشکر کرده 
    3,527
    تشکر تشکر شده 
    5,275
    تشکر شده در
    3,184 پست
    حالت من : Akhmoo
    قدرت امتیاز دهی
    4451
    Array

    برنامه اي كه دترمينان رو حساب ميكنه

    اینم یه برنامه که دترمینان رو حساب میکنه...

    /*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 آمده است.
    [دل خوش از آنیم که حج میرویم؟ ..]
    غافل از آنیم که کج میرویم



    [SIGPIC][/SIGPIC]


  3. #3
    عضو سایت
    گاه برای ساختن باید ویران کرد، گاه برای داشتن باید گذشت ، و گاه در اوج تمنا باید نخواست!
    تاریخ عضویت
    Jun 2011
    محل سکونت
    یک خانه
    نوشته ها
    25,040
    تشکر تشکر کرده 
    3,527
    تشکر تشکر شده 
    5,275
    تشکر شده در
    3,184 پست
    حالت من : Akhmoo
    قدرت امتیاز دهی
    4451
    Array

    پیش فرض

    اینم توضیحات کوچولو درمورد دترمینان...

    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 )


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

    اميدوارم توضيح مفيد بوده باشه. اگه خوب توضيح ندادم ببخشيد.
    [دل خوش از آنیم که حج میرویم؟ ..]
    غافل از آنیم که کج میرویم



    [SIGPIC][/SIGPIC]


برچسب ها برای این تاپیک

علاقه مندی ها (بوک مارک ها)

علاقه مندی ها (بوک مارک ها)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست در پست خود ضمیمه کنید
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

http://www.worldup.ir/