PDA

View Full Version : دترمینان ماتریس n*n



Buggsbunny
چهارشنبه 17 تیر 1383, 16:10 عصر
سلام!
بچه ها کسی معادله یا الگوریتم خاصی برای محاسبه دترمینان یه ماتریس n*n میدونه؟
مرسی!

Sepidar
چهارشنبه 17 تیر 1383, 18:51 عصر
یه الگوریتم بازگشتی سادست!

1. دترمینان یک ماتریس مربعی 1×1 خودش است!
2. دترمینان هر ماتریس مربعی دیگر، با کمک دترمینان ماتریسهای همسازه مرتبه پایینتر بدست می‌آید. مثلا اگرA یک ماتریس مربعی n*n باشد داریم:


det(A) = A[i,1] * det(h(A,i,1)) * pwr(-1,0) +
A[i,2] * det(h(A,i,2)) * pwr(-1,1) +
A[i,3] * det(h(A,i,3)) * pwr(-1,2) +
...
A[i,j] * det(h(A,i,j)) * pwr(-1,j-1) +
...
A[i,n] * det(h(A,i,n)) * pwr(-1,n-1);
که در آن i یک عدد طبیعی دلخواه بین 1 تا n و
pwr تابع توان و
h تابع به دست آوردن ماتریس همسازه است.

توجه:ماتریس همسازه ماتریسی است که از حذف یک سطر و ستون از یک ماتریس دیگر به دست می آید.

whitehat
چهارشنبه 17 تیر 1383, 21:09 عصر
شما به این تاپیک مراجعه کنید .
http://www.barnamenevis.org/forum/viewtopic.php?t=3475
با تشکر از آقا کامبیز .ولی ممکنه برای 6 در 6 به بعد با خطای overflow مواجه شوید .
موفق باشید

Sepidar
چهارشنبه 17 تیر 1383, 23:16 عصر
تا 15 در 15 خیالت راحت باشه.
اما به هرحال اگه ماتریسهات بزرگن و حتما احتیاج به وارونشون داری، بهتره از روشهای عددی معادله زیر رو حل کنی:
A*A^(-1)=I

Buggsbunny
پنج شنبه 18 تیر 1383, 00:25 صبح
مرسی داداش حل شد!!
خدا بچه هات رو زیاد کنه!

نیک نژاد
پنج شنبه 18 تیر 1383, 06:52 صبح
با سلام
فکر کنم این هم خوب جواب بده


#include<conio.h>
#include<stdio.h>
#include<math.h>
int main()
{
clrscr();
int i,j,k=1,n,p;
float m[50][50],a[50][50],b[50][50],h,det=1;
printf("enter row and column of matrix:");
scanf("%d%d",&n,&p);
if(p!=n)
printf("this matrix havenot the determinan!");
else
{
printf("enter element of matrix:\n");
for(i=1;i<=n;++i)
{
printf("\n");
for(j=1;j<=n;++j)
{
printf("a[%d,%d]=",i,j);
scanf("%f",&a[i][j]);
b[i][j]=a[i][j];
if(i==n &&j==n)
printf("\a\a");
}
}
i=1;
/*while(i<=n)
{
if(a[i][1]==0)
++i;
else
break;
}
if(i-1==n)
{
printf("determinan of matrix(%d*%d)=%d\n",n,n,0);
printf("matrix(%d*%d) is:",n,n);
for(i=1;i<=n;++i)
{
printf("\n");
for(j=1;j<=n;++j)
printf("%4.2f ",b[i][j]);
}
getch();
return 0;
} */
while(k<=n-1)
{
for(i=k+1;i<=n;++i)
{
if(abs(a[k][k])<abs(a[i][k]))
{
for(j=1;j<=n;++j)
{
h=a[k][j];
a[k][j]=a[i][j];
a[i][j]=h;
}
det=-1*det;
break;
}
}
for(i=k+1;i<=n;++i)
{
if(a[k][k]!=0)
m[i][k]=(float)(a[i][k]/a[k][k]);
for(j=1;j<=n;++j)
a[i][j]=a[i][j]-m[i][k]*a[k][j];
}
++k;
}
for(i=1;i<=n;++i)
det=det*a[i][i];
printf("determinan of matrix (%d*%d)=%4.2f\n",n,n,det);
printf("matrix(%d*%d) is:",n,n);
for(i=1;i<=n;++i)
{
printf("\n");
for(j=1;j<=n;++j)
printf("%4.2f ",b[i][j]);
}
}
getch();
}

دوست عزیز، لطفا برای مشخص کردن بخش کد، از تگهای مربوطه استفاده کنید.

nahal 2005
سه شنبه 06 دی 1384, 21:00 عصر
سلام
دوست عزیز :
برای حل این برنامه می توان از روش گاوس-جردن نیز استفاده کرد یعنی هر بار با استفاده از یک حلقه زیر قطر اصلی ماتریس را صفر کنی.!!

bestprogrammer
یک شنبه 17 شهریور 1387, 16:29 عصر
سلام بر اساس الگوریتم بازگشتی جناب sepidar این برنامه رو نوشتم ولی درست جواب نمیده ظاهرا ایراد syntax داره .کسی ایراد برنامرو نمیدونه؟

#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
int **h(int **a,int k,int f);//تابع بدست اوردن ماتریس همسازه
int det(int **p,int n);
int **h(int **a,int k,int f)
{
int i,j,l,m;
int **z;
z=(int **)malloc(sizeof(int)*(k-1));
if (!z)
{
textcolor(4);
cprintf("no memory");
exit(0);
}
for (i=0;i<k-1;i++)
{
z[i]=(int*)malloc(sizeof(int)*(k-1));
if (!z[i])
{
textcolor(4);
cprintf("no memory");
exit(0);
}
}
for (i=1,l=0;i<k;i++,l++)
for(j=0,m=0;j<k;j++)
if(j!=f)
{
z[l][m]=a[i][j];
m++;
}
return(z);
}
int det(int **p,int n)
{
int s,q=0;
if (n==2)
s=(p[0][0]*p[1][1])-(p[0][1]*p[1][0]);
else
for(q=0;q<n;q++)
s=s+(p[0][q]*det(h(p,n,q),n-1)*pow(-1,q));
return(s);
}
int main()
{
int **p;
int n,i,j,b;
printf("enter matrix dimension:");
scanf("%d",&n);
p=(int **)malloc(sizeof(int)*n);
if (!p)
{
textcolor(4);
cprintf("no memory");
exit(0);
}
for(i=0;i<n;i++)
{
p[i]=(int*)malloc(sizeof(int)*n);
if(!p[i])
{
textcolor(4);
cprintf("no memory");
exit(0);
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("Enter p[%d][%d]:",i,j);
scanf("%d",&p[i][j]);
}
b=det(p,n);
printf("%d",b);
getch();
return (0);
}