
محاسبه دترمینان ماتریس ، الگوریتم و برنامه بازگشتی
برنامه بازگشتی محاسبه دترمینان ماتریس و درک آن یکی از راه های موثر برای درک مفهوم بازگشتی و تابع بازگشتی است. با ما همراه باشید.
فهرست مطالب
الگوریتم محاسبه دترمینان به صورت بازگشتی
برنامه محاسبه دترمینان ماتریس و درک آن یکی از راه های موثر برای درک مفهوم بازگشتی و تابع بازگشتی است .پس با ما باشید تا این سوال را حل کنیم و با دترمینان و روش حل آن بیشتر آشنا شویم.
برای نوشتن این برنامه ابتدا باید بدانیم دترمینان یک ماتریس چطور حساب می شود .در شکل زیر محاسبه دترمینان را برای ماتریس ۳*۳ می بینید برای ماتریس های دیگر هم به همین طور است مشاهده می شود که برای محاسبه ماتریس ۳*۳ این گونه عمل کرده ایم درایه سطر اول را ضرب در دترمینان ماتریس جدید حاصل از حذف سطر اول و ستون اول کرده ایم و بعد منهای درایه سطر اول و ستون دوم ضرب در دترمینان ماتریس جدید حاصل از حذف سطر اول و ستون دوم کرده ایم و در مرحله بعد به علاوه درایه سطر اول و ستون سوم ضرب در دترمینان ماتریس حاصل از حذف سطر اول و ستون سوم کرده ایم.
به هر یک از این ماتریس های جدید یک کهاد می گوییم. برای سایر ماتریس ها با اندازه های مختلف می توان همین روش را بسط داد.
خوب ما چطور این روش ریاضی را به برنامه کامپیوتری تبدیل کنیم .ما فرض می کنیم یک ماتریس ۴*۴ داریم که می خواهیم دترمینانش را حساب کنیم اگر از روش بالا استفاده کنیم ۴ تا ماتریس جدید به وجود می آید که ۳*۳ اند ما یکی از آن ها را در نظر می گیریم برای محاسبه دترمینان ماتریس ۳*۳ طبق فرمول بالا عمل کرده و در این مرحله هم ۳ ماتریس جدید ۲*۲ به دست می آید و ما هم می دانیم دترمینان ماتریس ۲*۲ برابر می شود با حاصل ضرب درایه های قطر اصلی منهای حاصل ضرب درایه های قطر فرعی .یعنی هر ماتریس چند در چندی دادندآن را مرتب خرد می کنیم و با ماتریس های کوچک تر جایگزین می کنیم تا به ماتریس های ۲*۲ برسیم .به این استدلال روش بازگشتی می گویند.
کد بازگشتی محاسبه دترمینان
در ادامه به دو زبان سی و سی پلاس پلاس الگوریتم توضیح داده شده، کدنویسی و ارائه شده است.
در کد نوشته شده تابع inter (درستش Enter است) درایه های ماتریس را می خواند و ماتریس را ایجاد می کند و تایع show ماتریس را نشان می دهد و تابع build کار ساختن کهاد(ماتریس ها جدید) را انجام می دهد و تابع det دترمینان را محاسبه می کند و دارای ساختار بازگشتی است و شرط محدود کننده n=2 است که می گوید اگر طول ماتریس برابر ۲ بود ضرب درایه های قطر اصلی منهای ضرب درایه های قطر فرعی را برگردان و اگر n>2 از فرمول ریاضی استفاده می شود و تابع دترمینان دوباره فراخوانده می شود.
برنامه محاسبه دترمینان ماتریس به زبان سی
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include <stdio.h> #include <stdlib.h> #include <math.h> //---------------------------------------------------------- //read matrix void inter(int a[100][100],int n) { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("enter row %d column %d:",i,j); scanf("%d",&a[i][j]); } } } //----------------------------------------------------- // show matrix void show(int a[100][100],int n) { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%d ",a[i][j]); } printf("\n"); } } //--------------------------------------------------- //build new matrix:khad void build(int b[100][100],int a[100][100],int i,int n) { int j,l; int h = 0,k = 0; for(l=1;l<n;l++) { for( j=0;j<n;j++) { if(j==i) continue; b[h][k] = a[l][j]; k++; if(k == n-1) { h++; k = 0; } } } } //--------------farhad dalirani--------------------------- //calculate determinte int det(int a[100][100],int n) { int i,sum=0; int b[100][100]; if(n==2) { sum=a[0][0]*a[1][1]-a[0][1]*a[1][0]; return sum; } else { for(i=0;i<n;i++) { build(b,a,i,n); sum+=a[0][i]*pow(-1,i)*det(b,(n-1)); } } return sum; } //------------------------------------------- //main fuction and give lenght of matrix int main() { int n; int a[100][100]; printf("enter lenght of matrix:"); scanf("%d",&n); printf("\n--------------------------\n"); inter(a,n); printf("--------------------------\n"); show(a,n); int d; d=det(a,n); printf("--------------------------\n"); printf("\n\n result: %d",d); printf("\n\n=======================\n"); return 0; } |
برنامه محاسبه دترمینان ماتریس به زبان سی پلاس پلاس
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | // determinate.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <math.h> using namespace std; //---------------------------------------------------------- //read matrix void inter(int a[100][100], int n) { int i, j; for (i = 0; i<n; i++) { for (j = 0; j<n; j++) { cout << "enter row " << i << " column " << j << " :"; cin >> a[i][j]; } } } //----------------------------------------------------- // show matrix void show(int a[100][100], int n) { int i, j; for (i = 0; i<n; i++) { for (j = 0; j<n; j++) { cout << a[i][j] << " "; } cout << endl; } } //--------------------------------------------------- //build new matrix:khad void build(int b[100][100], int a[100][100], int i, int n) { int j, l; int h = 0, k = 0; for (l = 1; l<n; l++) { for (j = 0; j<n; j++) { if (j == i) { continue; } b[h][k] = a[l][j]; k++; if (k == n - 1) { h++; k = 0; } } } } //--------------open-mind.ir-------------------------- //calculate determinte int det(int a[100][100], int n) { int i, sum = 0; int b[100][100]; if (n == 2) { sum = a[0][0] * a[1][1] - a[0][1] * a[1][0]; return sum; } else { for (i = 0; i<n; i++) { build(b, a, i, n); sum += a[0][i] * pow(-1, i)*det(b, (n - 1)); } } return sum; } //------------------------------------------- //main fuction and give lenght of matrix int main() { int n; int a[100][100]; cout << "enter lenght of matrix:"; cin >> n; cout << "\n--------------------------\n"; inter(a, n); cout << "--------------------------\n"; show(a, n); int d; d = det(a, n); cout << "--------------------------\n"; cout << "\n\n result: " << d; cout << "\n\n=======================\n"; return 0; } |
با سلام
ببخشید دترمینان همون معنی معکوس رو میده؟
سلام
خیر، برابر نیستند و مفاهیم شون تفاوت داره. در محاسبه وارون یک ماتریس از مقدار دترمینان به طور جداگانه استفاده میشه.
تعریف معکوس/وارون ماتریس رو در لینک زیر مطالعه کنید:
ماتریس وارون در ویکی پدیا
سلام
ببخشید اگه درایه ها اعشاری باشن یعنی float باشن، در این صورت در قسمت دترمینان چه تغییری باید به وجود بیاریم؟
چون همین برنامه رو نوشتم ولی دترمینان غلط درومد. ممنون میشم اگر سریع تر جواب بدید خیلی ضروریه
سلام
فقط کافیه که در تابع main ماتریس a رو به جای int به صورت float تعریف کنید
موفق باشید
مگه ماتریس ما n*n نیست پس. اون صد صدی ک اول نوشتین چیه
نخیر. n*n نیست.
کد فعلی این مطلب برای ماتریسی به حداکثر بزرگی ۱۰۰*۱۰۰ جواب میده
سلام
بسیار عالی بود.
خیلی ممنون.
خیلی عالی است لطفا در صورت امکان برنامه های دیگری را نیز قرار دهید ممنون
با سلام.این برنامه واسه دترمینان رو به زبان متلب هم بنویسید.
خود متلب دترمینان داره، کدش رو راحت می تونی ببینی
با سلام وتشکر از زحمتهای شما
لطفا پارامترهای k و h را در برنامه تعیین دترمینال توضیح دهید
خیلی ممنون میشم زود جواب بدهید
ماتریس A را با L و j پیمایش می کنیم و تک تک خانه هایش رو دسترسی پیدا می کنیم، حالا قرار است که سطر اول و ستون I را از ماتریس a حذف کنیم و در b بریزیم, برای این کار h و k را تعریف کرده ام، h به سطر ها در ماتریس b اشاره داره و k به ستون ها در ماتریس b.
سلام اگه میشه برنامه ترانهاده یک دترمینانم بنویسید
الان نمی تونم ولی تا آخر این ماه حتما می گذارم.
این ک خیلی اسونه i و j ماتریسو بخونه بعد i,j = j,i تو ماتریس جدید بذاره
سلام دوست عزیز من برای ساختن دترمینال ماتریس ۵در۵ سی پلاس پلاس باید از همین استفاده کنیم ممنون میشم سریع پاسخ دهید
بله
خیلی ممنون از برنامه ی خوبتون
douste aziz agar barname sari baste mishe,bade return0:
charecter begir ba dastoure;
getch(); hamin
تو صفحه ی ران نمیماند که جواب دترمینان را مشاهده کینم
در خط آخر main برنامه یک چیزی از ورودی بخون مثلا یک کاراکتر رو بخون، اون موقع دیگه صفحه سریع بسته نمی شه!
douste aziz agar barname sari baste mishe,bade return0:
charecter begir ba dastoure;
getch(); hamin
خیلیییییییییی ممنون از برنامه ای که گذاشتید
خیلی عالیه خیلی کم پیش میاد سایت های برنا مه نویسی حرفه ای کار کنن ولی شما واقعا حرفه ای هستین به کارتون ادامه بدید مرسی
تشکر از لطفتون