برنامه محاسبه معکوس ماتریس n * n ( زبان C# )


در پست های قبل نحوه به دست آوردن معکوس یا واران یک ماتریس 3 در 3 یا بیشتر و همچنین شروط آن را یادآوری کردیم. در این پست هم برای کسانی که مانند من علاقه دارند برنامه محاسبه را خودشان به صورت دلخواه بنویسند، نکاتی را توضیح خواهیم داد. هدف اصلی من از این چند پست، افزایش مهارت در برنامه نویسی با بهانه تعیین معکوس یا واران یک ماتریس بود که سوژه خوبی برای برنامه نویسی در سطوح مقدماتی است؛ در این میان یک یادآوری هم از دروس دوران دبیرستان شد. در انتهای پست نیز میتوانید نسخه ای از برنامه ای که من برای این چند پست نوشته ام را داشته باشید. که به احتمال زیاد بدون مشکل نخواهد بود.

اولین کار برای محاسبه معکوس ماتریس به دست آوردن ماتریس الحاقی است. ماتریس الحاقی ماتریسی هم مرتبه ماتریس ورودی است که درایه های آن از انجام 3 عملیات زیر به دست می آید :
1 : هر درایه برابر است با کهاد ماتریس نسبت به سطر و ستون آن درایه.
2 : درایه های ماتریس با شرط اینکه، "اگر سطر + ستون درایه یا i+ j فرد بود" تغییر علامت می یابند.
3 : درایه های نسبت به قطر اصلی جابه جا می شوند. مانند اینکه قطر اصلی را محور تقارن ماتریس در نظر بگیریم.
برای دو تغییر اول فرمول زیر استفاده می شود و ماتریسی که از این اعمال این دو تغییر به دست می یابد را ماتریس همسازه گفته می شود.

A i, j = (-1) ᴵ + ᴶ x | M i ,j |

من تابع محاسبه ماتریس همسازه را اینگونه نوشته ام :

private double[,] Hamsaze(double[,] matrix)
{
int Size = (int)Math.Sqrt(matrix.Length);
double[,] result = new double[Size, Size];
for (int i = 0; i < Size; i++)
{
   for (int j = 0; j < Size; j++)
   {
      result[i, j] = Math.Pow(-1, (i+1 + j+1)) * Determinant(Kehad(matrix, i, j));
   }
}
return result;
}

در این تابع دو تابع دیگر به نام Determinant و Kehad را مشاهده می کنید. که از نامشان پیداست خروجی انها چیست.
تابع دترمیان :
private double Determinant(double[,] matrix)
{
double determinant = 0;
int Size = (int)Math.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 += (int)Math.Pow(-1, (i + 1) + 1) * matrix[0, i] * Determinant(Kehad(matrix, 0, i));
}
return determinant;
}

تابع کهاد :

private double[,] Kehad(double[,] matrix, int ROW, int COL)
{
int Size = (int) Math.Sqrt(matrix.Length);
double[,] result = new double[Size - 1, Size - 1];
int x = -1, y = 0;
for (int i = 0; i < Size; i++)
{
   if (i == ROW)
   continue;
   x++;
   y = 0;
    for (int j = 0; j < Size; j++)
    {
      if (j == COL)
      continue;
      result[x, y++] = matrix[i, j];
    }
}
return result;
}
تابعی که برای اعمال تغییر سوم (به همراه دو تغییر اول) به کار برده ام Adjugate نام دارد و کاری که می کند، جابه جا کردن درایه های ماتریس همسازه نسبت به قطر اصلی آن است.
private double[,] Adjugate(double[,] matrix, int row, int col)
{
// first step
matrix = Hamsaze(matrix);

//second step
double temp = 0;
for (int i = 0; i < row; i++)
   {
    for (int j = i - 1; j >= 0; j--)
    {
      temp = matrix[j, i];
      matrix[j, i] = matrix[i, j];
      matrix[i, j] = temp;
    } 
   }  
return matrix;
}
با به دست آوردن ماتریس الحاقی تنها کاری که باید بکنیم این است که معکوس دترمینان ماتریس ورودی را در ماتریس الحاقی ضرب کنیم. این کار ساده است چون تنها باید این عدد را در تک تک درایه های ماتریس الحاقی ضرب کنیم. برای مثال ضرب یک عدد در ماتریس می تواند با کد زیر انجام شود. (البته واضح است که در تمام توابع بالا و تابع زیر سطر و ستون ماتریس یا row و col با یکدیگر برابر خواهد بود چون مربعی بودن ماتریس، پیش شرط وجود این مشتقات است.)  
فرمول محاسبه ماتریس معکوس : 
Inv(matrix) = 1 / Determinant(matrix)  x  Adjugate-matrix
ضرب یک عدد در ماتریس :
number : عدد مورد نظر
for (int i = 0; i < row; i++)
   for (int j = 0; j < col; j++)
   {
      matrix[i, j] *= number;
   }
در پایان می توانید از لینک زیر برنامه ی ساده ای که برای محاسبه معکوس ماتریس در محیط دات نت نوشته ام را دانلود و تست کنید. البته باید آخرین نسخه دات نت را برای اجرای این برنامه داشته باشید.
دانلود


مطالب مشابه :


معکوس ماتریس 3 در 3

Inverse of 3x3 Matrix. برای پیدا کردن معکوس ماتریس 3 در 3 ، ابتدا دترمینان آن را حساب می کنیم.اگر




معکوس ماتریس 3 * 3 و بالاتر ( n * n )

در طی پست های قبل با نحوه به دست آوردن دترمینان یک ماتریس، ماتریس کهاد، ماتریس همسازه و




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

برای حساب کردن دترمینان ماتریس 3 در 3 یه بار تابع رو با n = 3 فراخوانی می کنیم .




بدست آوردن معکوس ماتریس

Inverse of 3x3 Matrix. برای پیدا کردن معکوس ماتریس 3 در 3 ، ابتدا دترمینان آن را حساب می کنیم.اگر




بدست آوردن وارون یا معکوس یک ماتریس

اما مسئله مهم این است که اینجا میخواهیم معکوس ماتریس 3*3 رو سه در سه, دترمینان ماتریس 3, 3




راهنمایی درمورد برنامه محاسبه دترمینان ماتریس (به درخواست محمد رضا)

برای حساب کردن دترمینان ماتریس 3 در 3 یه بار تابع رو با n=3 فراخوانی می کنیم .




ماتریس

این روش که به روش کرامر مرسوم است، بر اساس استفاده صریح از دترمینان ماتریس اگر در ماتریس




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

دترمینان ماتریس مربعی - که به صورت | A | یا ام معکوس a 11 و ضرب آن در دترمینان ( T 3 ( n - 1:




برنامه محاسبه معکوس ماتریس n * n ( زبان C# )

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




برچسب :