PDA

View Full Version : cách giải 1 hệ phương trình tuyến tính. có pro nào giúp chỉ cho em với



vuasaman
13-05-2010, 10:39 PM
có pro nào đỉnh cao !!!
chỉ cho em cách giải 1 hệ phương trình tuyến tính với!!

vtlinh86
13-05-2010, 11:59 PM
anh ơi, hỏi cái gì dễ dễ đi ):)T):)T):)T

conrongchautien
14-05-2010, 01:54 AM
có pro nào đỉnh cao !!!
chỉ cho em cách giải 1 hệ phương trình tuyến tính với!!
Bạn xem bài này có đạt Yêu cầu bạn không nhé (Y:DY)
Đề:Viết chương trình giải hệ phương trình dạng sau:
a11 x1 = b1
a21 x1 + a22 x2 = b2
...
an1 x1 + an2 x2 + ... + ann xn = bn
(aij ≠0)
Chương trình cần có các hàm sau: hàm nhập hệ phương trình, hàm xuất hệ phương trình, hàm giải hệ phương trình và hàm main.

Lời giải:

/* Giai ma tran Gauss-Jodan (dung ham) */


#include <stdio.h>
#include <conio.h>

int i,j,n,m,k,dem=0;
double x,tam,a[10][11],b[10];

void nhap();
void xuat();
void giai();

//----------- NHAP HE PHUONG TRINH ----------------------------
void nhap(void)
{
printf("Nhap n = "); scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
printf(" a[%d][%d] = ",i+1,j+1);
scanf("%lf",&a[i][j]);
}
printf(" b[%d] = ",i+1);
scanf("%lf",&b[i]);
}
}

//----------- XUAT HE PHUONG TRINH ------------------------------
void xuat(void)
{
for(i=0;i<n;i++)
{
for(j=0;j<=n;j++)
{
if(j<=i) printf("%5.2lf",a[i][j]);
else if(j==n) printf("%5.2lf",b[i]);
else printf(" ");
}
printf("\n");
}
}

//----------- GIAI HE PHUONG TRINH ---------------------------------
void giai(void)
{
//Tao ma tran lien ket.----------------------------------------------
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
{
if(j==n) a[i][j]=b[i];
else if(j>i) a[i][j]=0;
}
//Bat dau thuat toan gauss de giai he phuong trinh.-------------------
//Dung phep BDSC dua Aij ve ma tran cheo.
for(j=0;j<n;j++)
{
for(i=n-1;i>=j;i--)
{
if(a[i][j]==0) continue;//Neu phan tu a bang 0 thi tang i.
if((i>j)&&(a[i][j]!=0))
{
k=i-1;
while((k>=j)&&(a[k][j]==0)) k--;//Xet cac phan tu a khac 0 tren cung cot j
if(k<j)
{
//Doi cho dong thu i va j cho ca ma tran mo rong.
for(m=0;m<=n;m++)
{
tam=a[i][m];
a[i][m]=a[j][m];
a[j][m]=tam;
}
}
if((k>=j)&&(k>=0))
{
x=-a[i][j]/a[k][j];
//Nhan dong thu k cho x roi cong vao dong thu i.
for(m=0;m<=n;m++)
a[i][m]+=a[k][m]*x;
}
}
}
}
for(i=0;i<n;i++)
if(a[i][i]==0)
{
printf("\nHe phuong trinh VSN");
dem++;
return;
}
for(i=0;i<n;i++)
{
b[i]=a[i][n]/a[i][i];
}
}

//----------------- MAIN ----------------------------------------------
void main()
{
clrscr();
nhap();
printf("\nHe phuong trinh vua nhap:\n");
xuat();
giai();
printf("\nNghiem duy nhat cua phuong trinh la:");
if(dem==0)
{
for(i=0;i<n;i++)
{
printf("\n x%d = %5.2lf",i+1,b[i]);
}
}
getch();
}
Đừng nói bạn cũng học PTIT nhà. bải tập về nhà của mình đó(:P)

conrongchautien
14-05-2010, 01:58 AM
Hệ phương trình tuyến tính thì code đây:

/* Giai ma tran Gauss-Jodan (dung ham) */


#include <stdio.h>
#include <conio.h>

int i,j,n,m,k,dem=0;
double x,tam,a[10][11],b[10];

void nhap();
void xuat();
void giai();

//----------- NHAP HE PHUONG TRINH ----------------------------
void nhap(void)
{
printf("Nhap n = "); scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf(" a[%d][%d] = ",i+1,j+1);
scanf("%lf",&a[i][j]);
}
printf(" b[%d] = ",i+1);
scanf("%lf",&b[i]);
}
}

//----------- XUAT HE PHUONG TRINH ------------------------------
void xuat(void)
{
for(i=0;i<n;i++)
{
for(j=0;j<=n;j++)
{
if(j==n) printf("%5.2lf",b[i]);
else printf("%5.2lf",a[i][j]);
}
printf("\n");
}
}

//----------- GIAI HE PHUONG TRINH ---------------------------------
void giai(void)
{
//Tao ma tran lien ket--------
for(i=0;i<n;i++)
{
a[i][n]=b[i];
}
//Bat dau thuat toan Gauss-Jordan de giai he phuong trinh.------------
//Dung phep BDSC dua Aij ve ma tran cheo.
for(j=0;j<n;j++)
{
for(i=n-1;i>=j;i--)
{
if(a[i][j]==0) continue;//Neu phan tu a bang 0 thi tang i.
if((i>j)&&(a[i][j]!=0))
{
k=i-1;
while((k>=j)&&(a[k][j]==0)) k--;//Xet cac phan tu a khac 0 tren cung cot j
if(k<j)
{
//Doi cho dong thu i va j cho ca ma tran mo rong.
for(m=0;m<=n;m++)
{
tam=a[i][m];
a[i][m]=a[j][m];
a[j][m]=tam;
}
}
if((k>=j)&&(k>=0))
{
x=-a[i][j]/a[k][j];
//Nhan dong thu k cho x roi cong vao dong thu i.
for(m=0;m<=n;m++)
a[i][m]+=a[k][m]*x;
}
}
}
}
for(j=n-1;j>=0;j--)
{
for(i=0;i<=j;i++)
{
if(a[i][j]==0) continue;
if((i<j)&&(a[i][j]!=0))
{
k=i+1;
while((k<=j)&&(a[k][j]==0)) k++;
if((k<=j)&&(k<=n))
{
x=-a[i][j]/a[k][j];
//Nhan dong thu k voi x roi cong vao dong thu i.
for(m=0;m<=n;m++)
a[i][m]+=a[k][m]*x;
}
}
}
}
//Ket thuc qua trinh Gauss.
for(i=0;i<n;i++)
if(a[i][i]==0)
{
printf("\nHe phuong trinh VSN");
dem++;
return;
}
for(i=0;i<n;i++)
{
b[i]=a[i][n]/a[i][i];
}
}

//----------------- MAIN ----------------------------------------------
void main()
{
clrscr();
nhap();
printf("\nHe phuong trinh vua nhap:\n");
xuat();
giai();
printf("\nNghiem duy nhat cua phuong trinh la:");
if(dem==0)
{
for(i=0;i<n;i++)
{
printf("\n x%d = %5.2lf",i+1,b[i]);
}
}
getch();
}

vuasaman
16-05-2010, 11:39 AM
thank you!!! bạn nhiều!!
nhưng bạn ơi!!!
bạn có biết làm bằng phương pháp cramer không!
giúp mình luôn nhé!!
nếu bạn có thời gian dỗi thì cho mình nick chat mình pm được không

peterdrew
16-05-2010, 12:53 PM
Tình cờ có code này của anh Onminh nên tôi post lên cho tác giả tham khảo (rất cảm ơn anh Onminh đã code một code hay như thế):

#include <stdio.h>
#define nmax 20

class vector
{
double v[nmax];
int size;
public:
vector(int _size = nmax)
{
size = _size;
for (int k = 0; k < nmax; k++) v[k] = 0;
}

double &operator [] (int k) { return v[k];}
void show();
void input();
};

void vector::input()
{
printf("\nSo phan tu cua vec to: ");
scanf("%d",&size);
for (int k = 0; k < size; k++)
{
printf("[%d] = ", k);
scanf("%lf", &v[k]);
}
}

void vector::show()
{
for (int k = 0; k < size; k++) printf("%8.2lf",v[k]);
printf("\n");
}

class matrix
{
vector v[nmax];
int rows, cols;
public:
matrix(int r = nmax, int c = nmax)
{
rows = r; cols = c;
for (int k = 0; k < nmax; k++) v[k] = vector();
}
vector &operator [] (int k) { return v[k];}
int issquare();
matrix M(int, int);
double mdeterm();
matrix colreplace(int, vector);
friend int cramer(matrix, vector, vector &);
void input();
void show();
};

int matrix::issquare() { return rows==cols;}

void matrix::input()
{
printf("\nSo hang cua ma tran: ");
scanf("%d",&rows);
printf("\nSo cot cua ma tran: ");
scanf("%d",&cols);

for (int k = 0; k < rows; k++)
for (int j = 0; j < cols; j++)
{
printf("[%d][%d] = ", k,j);
scanf("%lf", &v[k][j]);
}
}

void matrix::show()
{
for (int k = 0; k < rows; k++)
{
for (int j = 0; j < cols; j++) printf("%8.2lf",v[k][j]);
printf("\n");
}
}

matrix matrix::M(int m, int n)
{
matrix b = *this;
int k, j;
for (k = m; k < rows-1; k++)
for (j = 0; j < cols; j++) b[k][j] = b[k+1][j];
for (j = n; j < cols-1; j++)
for (k = 0; k < rows; k++) b[k][j] = b[k][j+1];
b.rows = rows-1; b.cols = cols-1;
return b;
}

double matrix::mdeterm()
{
if (rows == 1) return v[0][0];
double temp = 0;
for (int k = rows-1; k >=0; k--)
if ((cols + k) % 2)
temp -= v[k][cols-1]*M(k,cols-1).mdeterm();
else
temp += v[k][cols-1]*M(k,cols-1).mdeterm();
return temp;
}

matrix matrix::colreplace(int k, vector c)
{
matrix b = *this;
for (int j = 0; j < rows; j++) b[j][k] = c[j];
return b;
}

int cramer(matrix a, vector b, vector &x)
{
double det = a.mdeterm();
if (det)
{
x = vector(a.rows);
for (int k = 0; k < a.rows; k++)
x[k] = a.colreplace(k,b).mdeterm()/det;
return 1;
}
return 0;
}

void main()
{
matrix a(4,4);
vector b, x;
a.input();
b.input();
if (a.issquare())
{
int status = cramer(a, b, x);
if (status)
{
printf("\nNghiem: ");
x.show();
}
else printf("\nHe suy bien\n");
}
else printf("\nHe khong tuong thich\n");
}
Đây là chương trình giải hệ phương trình tuyến tính bằng Cramer! Hy vọng ưng ý cậu.

vuasaman
16-05-2010, 07:43 PM
anh oi!! kái nài khó hiểu quá

hoang minh nguyen
16-05-2010, 10:40 PM
anh oi!! kái nài khó hiểu quá
công nhận là nhìn ko hiểu ji cả.nếu là hệ 4pt thì mình còn làm dc chứ nhiều hơn thì chịu

hoang minh nguyen
16-05-2010, 10:45 PM
Bạn xem bài này có đạt Yêu cầu bạn không nhé (Y:DY)
Đề:Viết chương trình giải hệ phương trình dạng sau:
a11 x1 = b1
a21 x1 + a22 x2 = b2
...
an1 x1 + an2 x2 + ... + ann xn = bn
(aij ≠0)

bạn ơi pp cramer chỉ áp dụng dc cho ma trận vuông thoi mà(số ẩn=số pt)

peterdrew
16-05-2010, 10:49 PM
bạn ơi pp cramer chỉ áp dụng dc cho ma trận vuông thoi mà(số ẩn=số pt)

Nguyen nói vấn đề này cũng không đúng đâu; cái của conrongchautien cũng là hệ với ma trrận vuông đấy thôi; đó cũng là hệ Cramer đó.