برنامه محاسبه دترمینان ماتریس n*n
در این پست برنامه محاسبه دترمینان یک ماتریس مربعی دلخواه را برای شما گذاشته ام که خودم با زبان سی شارپ نوشته ام ولی نمیتوانم بگویم که کاملا بدون ایراد است !
اگر نمی دانید که دترمینان یک ماتریس n*n چگونه محاسبه میشود یا مانند من یادتان رفته است، می توانید به سایت الگوریتمستان (algorithmha.ir) مراجعه کنید که در آن به طور کامل طریقه ی محاسبه دترمینان توضیح داده شده است.
واضح است که مهمترین بخش نوشتن این برنامه محاسبه ی دترمینان ماتریس است که با بسط ماتریس روی یک سطر یا ستون این کار صورت می گیرد. و برای این کار باید از یک تابع بازگشتی استفاده کنید. البته این تابع می تواند شکل های مختلفی داشته باشد. در ادامه روشی که برای نوشتن این تابع استفاده کرده ام را توضیح می دهم. برای این کار به یک تابع دیگر نیز احتیاج دارید که "ماتریس کهاد" ماتریس اولیه را محاسبه کند. نوشتن این تابع ساده است و تنها کافی است سطر و ستون گفته شده را از ماتریس حذف کنیم و مابقی درایه ها را به ماتریس حاصل انتقال دهیم.
می دانید که ماتریس را به صورت یک آرایه ی دو بعدی در نظر می گیریم. یک بار دیگر در نظر داشته باشید که برای نوشتن این برنامه باید ابتدا به طور کامل با مقدمات ریاضی آن اشنا باشید تا بتوانید آنها را در زبان بررنامه نویسی پیاده کنید. کد زیر را نگاه کنید. این کد من برای تعیین دترمینان ماتریس مربعی n*n است.
private float Determinant(float[,] matrix)
{
float determinant = 0;
int Size = sqrt(matrix.Length);
if (Size == 1)
{
return matrix[0, 0];
}
else if (Size == 2)
{
return (matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0]);
}
else
{
for (int i = 0; i < Size; i++)
determinant += power(-1, (i+1)+1) * matrix[0,i] * Determinant(Kehad(matrix, 0, i));
}
return determinant;
}
تابع بالا کمی احمقانه به نظر می رسد، دلیلش هم تازه کار بودن من است ولی کاری که میخواهیم انجام دهیم را انجام می دهد. به طور خلاصه در تابع بالا اینقدر ماتریس را کوچک می کنیم تا به یک ماتریس دو در دو (2*2) برسیم و وقتی به آن رسیدیم هم که دترمینان از از "تفاضل حاصلضرب درایه های قطر اصلی از حاصلضرب قطر فرعی" به دست می آید و همه هم آن را می دانیم. این روش "بسط لاپلاس" نامیده می شود و در سایت الگوریتمستان کاملا توضیح داده شده است.
نکات دیگری که در تابع بالا باید توضیح دهم یکی متغیر Size است که از جذر طول آرایه به دست می آید و همان تعداد سطر یا ستون ماتریس است. چون ماتریس "مربعی" است با محاسبه جذر طول آن (تعداد درایه های آن)، تعداد ستون ها یا سطر هایش مشخص می شود. (شاید روش بهتری هم برای اینکار باشد) اما بهر حال. در مورد تابع Kehad هم که گفتم که تابعی است که ماتریس "کهاد" یا mirror ماتریس اولیه را محاسبه می کند. تنها نکته ی اساسی تابع Determinant شاید "بازگشتی" بودن آن باشد که بدون استفاده از این شیوه شاید نتوان دترمینان ماتریس را محاسبه کرد. تابع Determinant خود را فراخوانی می کند ولی با هر بار فراخوانی، ماتریس کهاد کاتریس دور قبل به ان ارسال میشود و این چنین است که دترمینان یک ماتریس n*n محسابه می شود. در بالا ماتریس بر روی سطر اول (i == 0) بسط داده می شود. (پارامتر های دوم و سوم تابع کهاد، سطر و ستونی هستند که قرار است از ماتریس حذف شوند).
برنامه زیر که در آن از همین تابع استفاده شده است را می توانید برای محاسبه ی دترمینان ماتریس ها استفاده کنید ولی یادتان باشد که برای استفاده از آن باید .Net Framework روی کامپیوترتان نصب باشد. اگر به سورس برنامه احتیاج داشتید کافی است در قسمت نظرات مطرح کنید تا آن را برای شما قرار دهم. اگر برنامه مشکل دارد در بخش نظرات مطرح کنید تا بنده هم از آن مطلع شوم.
لینک 1
GENERAL INFORMATION