View Full Version: bài tập phương pháp tính

06dt1 > Giáo tŕnh > bài tập phương pháp tính


Title: bài tập phương pháp tính
Description: Chương tŕnh C


v2eu - October 14, 2007 03:41 AM (GMT)
Bài 3 Chương 3
CODE

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

int n;
float a,b,c[11];

void input()
{
printf("bac da thuc : n = "); scanf("%d",&n);
for (int i = 0; i<=n; i++)
  {
    printf("a[%d]=",i);
    scanf("%f",&c[i]);
  }
printf("nhap 2 gia tri a,b:\n");
printf("a = "); scanf("%f",&a);
printf("b = "); scanf("%f",&b);

}
float p(float x)
{
float s=c[0];
for (int i=1; i<=n; i++) s=s*x+c[i];
return s;
}

void output()
{
printf("\n\nket qua:\n");
printf("\np(%g) = %.3f",a,p(a));
printf("\np(%g) = %.3f",b,p(b));
printf("\n\np(%g) + p(%g) = %.3f ",a,b,p(a)+p(b));
}

void main()
{
clrscr();
input();
output();
getch();
}

v2eu - October 14, 2007 03:53 AM (GMT)
Bài 4 Chương 3
CODE

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

int n,m;
float c,p[3][11];

void input()
{
printf("bac da thuc Pn(x) : n = "); scanf("%d",&n);
for (int i = 0; i<=n; i++)
  {
    printf("Pn[%d]=",i);
    scanf("%f",&p[1][i]);
  }
printf("bac da thuc Pm(x) : m = "); scanf("%d",&m);
for (i = 0; i<=m; i++)
  {
    printf("Pm[%d]=",i);
    scanf("%f",&p[2][i]);
  }
printf("nhap gia tri c:\n");
printf("c = "); scanf("%f",&c);

}
float Hoocner_P(int deg,float x)
{
int b;
float pt=p[deg][0];
if (deg==1) b=n; else b=m;
for (int i=1; i<=b; i++) pt=pt*x+p[deg][i];
return pt;
}

void output()
{
printf("\n\nket qua:\n");
printf("\nPn(%g) = %.3f",c,Hoocner_P(1,c));
printf("\nPm(%g) = %.3f",c,Hoocner_P(2,c));
printf("\n\nPn(%g) + Pm(%g) = %.3f ",c,c,Hoocner_P(1,c)+Hoocner_P(2,c));
}

void main()
{
clrscr();
input();
output();
getch();
}

v2eu - October 14, 2007 03:54 AM (GMT)
Bài 5 Chương 3
CODE

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

int n;
float c,a[11];

void input()
{
printf("bac da thuc : n = "); scanf("%d",&n);
for (int i = 0; i<=n; i++)
  {
    printf("a[%d]=",i);
    scanf("%f",&a[i]);
  }
printf("nhap gia tri c:\n");
printf("c = "); scanf("%f",&c);
}

void solve(float x)
{
for (int k=n; k>=1; k--)
for (int i=1; i<=k; i++) a[i]=a[i-1]*x+a[i];
}

void output()
{
printf("\n\nHe so da thuc P(y) :\n");
for (int i=0; i<=n; i++)
printf("\na[%d] = %g ",i,a[i]);
}

void main()
{
clrscr();
input();
solve( c);
output();
getch();
}

v2eu - October 14, 2007 03:55 AM (GMT)
Bài 8 a Chương 4
CODE

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

int n;
float a,b,p[10];


float f(float x)
{
float ft=p[0];
for (int i=1; i<=n; i++)
  ft=ft*x+p[i];
return ft;
}

void input()
{
printf("bac cua phuong trinh : n = "); scanf("%d",&n);
for (int i=0; i<=n; i++)
 {
   printf("a[%d] = ",i);
   scanf("%f",&p[i]);
 }
do
{
   printf("nhap khoang nghiem a,b ( f(a)<0 , f(b)>0 ) : ");
   printf("\na = "); scanf("%f",&a);
   printf("b = "); scanf("%f",&b);
}
while (f(a)>0||f(b)<0);
}

void solve()
{
float c;
do
{
  c=(a+b)/2;
  if (f( c)>0) b=c; else a=c;
}
while (fabs(f( c))>0.001);
printf("Nghiem cua phuong trinh : x = %.3f ",c);
}

void main()
{
clrscr();
input();
solve();
getch();
}

v2eu - October 14, 2007 03:57 AM (GMT)
Bài 8 b Chương 4
CODE

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

int n;
float a,b,p[10];


float f(float x)
{
float ft=p[0];
for (int i=1; i<=n; i++)
  ft=ft*x+p[i];
return ft;
}

void input()
{
printf("bac cua phuong trinh : n = "); scanf("%d",&n);
for (int i=0; i<=n; i++)
 {
   printf("a[%d] = ",i);
   scanf("%f",&p[i]);
 }
printf("nhap khoang nghiem a,b : ");
printf("\na = "); scanf("%f",&a);
printf("b = "); scanf("%f",&b);
}

void solve()
{
float x=a-(b-a)*f(a)/(f(b)-f(a));
if (f(x)*f(a)<0)
do
{
  b=x;
  x=a-(b-a)*f(a)/(f(b)-f(a));
}
while (fabs(x-b)>0.001);
else
do
{
  a=x;
  x=a-(b-a)*f(a)/(f(b)-f(a));
}
while (fabs(x-a)>0.001);
printf("Nghiem cua phuong trinh : x = %.3f ",x);
}

void main()
{
clrscr();
input();
solve();
getch();
}

v2eu - October 14, 2007 03:59 AM (GMT)
Bài 9 Chương 4
CODE

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

float x,y;

void input()
{
printf("phuong trinh : e^x - 10x + 7 = 0\n\n");
printf("nhap gia tri x :");
printf("x = "); scanf("%f",&x);
}

float f(float x)
{
return (exp(x)-10*x+7);
}

float fdh(float x) /* e^x-10 */
{
return (exp(x)-10);
}

void solve()
{
do
{
 y=x;
 x=y-f(y)/fdh(y);
}
while (fabs(x-y)>0.001);
printf("\nNghiem cua phuong trinh : x = %.3f",x);
}

void main()
{
clrscr();
input();
solve();
getch();
}

v2eu - October 14, 2007 04:00 AM (GMT)
Bài 10 Chương 4
CODE

/* Xac dinh x1, x2 theo dinh ly 3 */

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

float a[20],m1,m2;
int n;

void input()
{
printf("nhap bac phuong trinh : n = ");
scanf("%d",&n);
for (int i=0; i<=n; i++)
 {
  printf("a[%d] = ",i);
  scanf("%f",&a[i]);
 }
}

void solve()
{
float m=a[1];
for (int i=1; i<=n; i++)
 if (fabs(a[i])>m) m=fabs(a[i]);
if (fabs(a[n])>m) m1=fabs(a[n]); else m1=m;
if (fabs(a[0])>m) m2=fabs(a[0]); else m2=m;
}

void output()
{
printf("\nx1 = %.3f",fabs(a[n])/(m2+fabs(a[n])));
printf("\nx2 = %.3f",1+m1/fabs(a[0]));
}

void main()
{
clrscr();
input();
solve();
output();
getch();
}

v2eu - October 14, 2007 04:02 AM (GMT)
Bài 11 Chương 4
CODE

/* Xac dinh can tren theo dinh ly 4 */

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

float a[20],m=-1,aa;
int n;

void input()
{
printf("nhap bac phuong trinh : n = ");
scanf("%d",&n);
for (int i=0; i<=n; i++)
 {
  printf("a[%d] = ",i);
  scanf("%f",&a[i]);
  if (a[i]<0&&m==-1) m=a[i];
 }
}

void solve()
{
if (a[0]<0)
 for (int i=0; i<=n; i++) a[i]=-a[i];
for (int i=1; i<=n; i++)
  if (a[i]<0)
   { m=i;
     aa=fabs(a[i]);
     break;
   }
for (i=m+1; i<=n; i++)
  if (fabs(a[i])>aa&&a[i]<0) aa=fabs(a[i]);
}

void output()
{
printf("\ncan tren cua nghiem duong : N = %.3f",1 + pow(aa/a[0],1/m));
}

void main()
{
clrscr();
input();
solve();
output();
getch();
}

conkienvang - October 15, 2007 07:54 AM (GMT)
Thank you Vhieu , tui dang can may bai nay, khong biet doc co hieu gi không, :) hi`hi`

nguyenken249 - October 15, 2007 10:38 AM (GMT)
Dù sao cũng cảm ơn ku Hiếu nhiều. Nhưng mà đọc không hiểu chi hết . Lâm nạn rồi anh em ơi!!!! Sinh ra lập tŕnh C làm chi không byeết nữa. hix! :botay :botay

admin - October 15, 2007 11:14 AM (GMT)
Hiếu đă post bài giải hết rồi nhỉ?
Đây là link toàn bộ bài giải của Hiếu, admin đă zip lại và up lên host mọi người có thể tải về từ đây để xem toàn bộ here
P/s:
QUOTE
if (f©>0) b=c; else a=c;
}
while (fabs(f©)>0.001);

QUOTE
solve©;

Mấy cái đó Hiếu viết bị bể font mọi người về chỉnh lại
Mấy bạn lớp ḿnh chưa giỏi về hàm lắm sao toàn dùng hàm không vậy như bài9-chương4 này nè;)
QUOTE

float f(float x)
{
return (exp(x)-10*x+7);
}

float fdh(float x) /* e^x-10 */
{
return (exp(x)-10);
}

Nên viết nhiều nhất là trong 1 main chính và 2 hàm là tốt hơn.Bữa sau nên up lên host cho mọi người tải về đọc và chạy chương tŕnh có lẽ là tốt hơn Hiếu :) Cảm ơn Hiếu nhé :P

hungbli - October 15, 2007 01:48 PM (GMT)
QUOTE (admin @ Oct 15 2007, 06:14 PM)
Hiếu đă post bài giải hết rồi nhỉ?
Đây là link toàn bộ bài giải của Hiếu, admin đă zip lại và up lên host mọi người có thể tải về từ đây để xem toàn bộ here
P/s:
QUOTE
if (f©>0) b=c; else a=c;
}
while (fabs(f©)>0.001);

QUOTE
solve©;

Mấy cái đó Hiếu viết bị bể font mọi người về chỉnh lại
Mấy bạn lớp ḿnh chưa giỏi về hàm lắm sao toàn dùng hàm không vậy như bài9-chương4 này nè;)
QUOTE

float f(float x)
{
return (exp(x)-10*x+7);
}

float fdh(float x) /* e^x-10 */
{
return (exp(x)-10);
}

Nên viết nhiều nhất là trong 1 main chính và 2 hàm là tốt hơn.Bữa sau nên up lên host cho mọi người tải về đọc và chạy chương tŕnh có lẽ là tốt hơn Hiếu :) Cảm ơn Hiếu nhé :P

mịa, thằng admin lắm chuyện thật, họ đă có công làm rồi c̣n nói này nói nọ, coi chừng anh oánh mày chừ

admin - October 16, 2007 03:20 AM (GMT)
Nói cái kiểu ǵ vậy, không phải admin lo cho lớp nên chỉnh sửa lại đoạn viết bị bể font trên kia sao. Nếu chép hay cop về chạy mà báo lỗi th́ ai chịu trách nhiệm.? Trong C++ th́ chương tŕnh càng ngắn gọn càng tốt chứ sao, bài 9 đó thấy không cần làm vậy lắm nên admin góp ư thôi.
Chúc mọi người có kết quả tốt môn Phương pháp tính nhé :rolleyes:

admin - October 26, 2007 03:11 PM (GMT)
Đây là bài giải hệ phương tŕnh bằng phương pháp khử Gauss, mọi người tải về làm nè
download here
Preview:
CODE

  #include <stdio.h>
  #include <conio.h>
  #include <math.h>
  #define M 10
  #define fi "in.inp"
  #define fo "ou.out"
  FILE *f1,*f2;
  float a[M][M],x[M],temp;
  int n;
  float m;
 /*NHAP MANG VA N TU FILE*/
  void input()
  {
    int i,j;
    f1=fopen(fi,"r");
    fscanf(f1,"%d\n",&n);
    for (i=1;i<=n;i++)
     for (j=1;j<=n+1;j++)
       {
         fscanf(f1,"%f",&temp);
         a[i][j]=temp;
       }
    fclose(f1);
  }
 /*THUAT TOAN DOI HANG MA TRAN*/
  void switchrow(int dong, int cot)
  {
    int j;
    float tmp;
     for(j=1;j<=n+1;j++)
      {
        tmp=a[dong][j];
        a[dong][j]=a[cot][j];
        a[cot][j]=tmp;

      }
  }
  /*XU LY CHUYEN VE MA TRAN TAM GIAC*/
  void process()
  {
   int i,j,k=1;
   float hs;
    for (i=1;i<=n-1;i++)
     {
       if(a[i][i]==0)
        {
          k+=1;
          while ((a[k][i]!=0)&&(k<=n))
            k+=1;
            if(k<=n) switchrow(i,k);
        }
       else
        {
          for(j=i+1;j<=n;j++)
           if (a[j][i]!=0)
            {
               hs=-a[j][i]/a[i][i];
               for (k=i;k<=n+1;k++)
               a[j][k]=a[j][k]+a[i][k]*hs;
            }
        }
     }
  }
  /*THUAT TOAN TIM NGHIEM*/
  void findroot()
  {
    int i,j;
    float s;
     for (i=n;i>=1;i--)
      {
        s=a[i][n+1];
        for (j=i+1;j<=n;j++)
         s-=a[i][j]*x[j];
         if (a[i][i]==0)
           if (s==0) x[j]=1;
           else
             {
               printf("\n he vo nghiem");
               getch();
             }
         else x[i]=s/a[i][i];
      }
  }
  /*XUAT NGHIEM RA TEP*/
  void output()
  {
    int i;
    f2=fopen(fo,"w");
    for (i=1;i<=n;i++)
    fprintf(f2,"%.2f ",x[i]);
    fclose(f2);
  }
  /********************************************************************/
  void main()
  {
    input();
    process();
    findroot();
    output();
  }

v2eu - October 27, 2007 10:31 AM (GMT)
Minh code bài quá tốt :lol: đọc file theo chuẩn C lun, xử lí lun cả trường hợp các hệ số a[i][i]=0, :clap

Tuy nhiên c̣n sai 1 chút xíu, có thể có vài test sai:


Ḍng k+=1; đầu tiên của function chuyển về ma trận tam giác

- sẽ sai khi gặp test :

3
1 1 1 3
1 1 2 4
2 3 0 5

Nghiêm của hệ phải là 1 1 1 ____ thay v́ vô nghiệm như chương tŕnh

----> sửa lại k=i+1; th́ đúng hơn (ḍng k+=1; đầu tiên trong function
--> mà không hiểu tại sao không thể ra nghiệm 1 1 1 được, hic


ANH EM lớp ḿnh nếu thấy mấy bài C post lên có vấn đề th́ cứ ư kiến thoải mái nhen ;) ư kiến càng nhiều thi mọi người sẽ viết chương tŕnh tốt hơn thui ---> no problem.

Đừng nghe lời thèn Hùng bli mập ú đó.[B] :P

v2eu - October 27, 2007 05:07 PM (GMT)
T́nh h́nh thực tế cho thấy, V Hiếu không t́m được chính xác lỗi trong chương tŕnh của Minh. Hic, sorry các bạn, chương tŕnh dài quá, mỗi người lại viết theo 1 phong cách khác nhau.

---> admin code th́ để admin debug vậy. Thèn admin t́m lỗi nhanh lắm anh em không đợi lâu mô

conkienvang - November 3, 2007 04:07 PM (GMT)
Đề nghị mấy Pro. viết bài C++ theo ngôn ngữ b́nh dân một chút, chứ viết bài kiểu này đọc là sổ mũi nhức đầu chảy máu cam luôn đó.
ặc ặc. ê ê.

admin - November 22, 2007 03:26 AM (GMT)
Đây là bài Nội suy Ayken: Download here
Preview here
CODE
 #include <stdio.h>
 #include <conio.h>
 #include <math.h>
 #define fi "Ayken.inp"
 #define fo "Ayken.out"
 #define fu "Table.out"
 #define M 10
 float x[M],y[M],t,w,s,d;
 float z[M][M];
 int n;
 FILE *f1,*f2,*f3;
 //******************************************************************
 void input()
  {
    int i,j;
    f1=fopen(fi,"r");
    fscanf(f1,"%d\n",&n);
    for (i=0;i<=n;i++)
      fscanf(f1,"%f",&x[i]);
    for (j=0;j<=n;j++)
      fscanf(f1,"%f",&y[j]);
    fscanf(f1,"%f",&t);
    fclose(f1);
  }
 //******************************************************************
 void process()
 {
   int i,j;
   w=1; s=0;
   for (i=0;i<=n;i++)
    {
      w*=t-x[i];
      d=1;
      for (j=0;j<=n;j++)
       {
         if (j!=i) d*=x[i]-x[j];
         else d*=t-x[i];
       }
     s+=y[i]/d;
    }
 }
 //******************************************************************
 void table()
 {
   int i,j;
   for (i=0;i<=n;i++)
    for (j=0;j<=n;j++)
    {
     if (j!=i) z[i][j]=x[i]-x[j];
     else z[i][j]=t-x[i];
    }
 }
 //******************************************************************
 void output()
 {
   f2=fopen(fo,"w");
   fprintf(f2,"%.2f",w*s);
   fclose(f2);
 }
 //******************************************************************
 void printable()
 {
   int i,j;
   f3=fopen(fu,"w");
   for (i=0;i<=n;i++)
    for (j=0;j<=n;j++)
     {
       fprintf(f3,"%.2f ",z[i][j]);
       if (j==n) fprintf(f3,"\n");
     }
   fclose(f3);
 }
 //******************************************************************
 void main()
 {
  input();
  process();
  table();
  output();
  printable();
 }


File in đầu vào có dạng:
user posted image
File đầu ra cho ta kết quả hàm f(t):
user posted image
Giá trị bảng Ayken:
user posted image

admin - November 23, 2007 11:09 AM (GMT)
Đây là bài nối uy Ayken dạng 2: Download here
Preview here
CODE
 #include <stdio.h>
 #include <conio.h>
 #include <math.h>
 #define fi "Ayken2.inp"
 #define fo "Ayken2.out"
 #define fu "Table2.out"
 #define M 10
 float x[M],y[M],z[M],t;
 float k[M][M];
 int n;
 FILE *f1,*f2,*f3;
 //******************************************************************
 void input()
  {
    int i,j;
    f1=fopen(fi,"r");
    fscanf(f1,"%d\n",&n);
    for (i=0;i<=n;i++)
      fscanf(f1,"%f",&x[i]);
    for (j=0;j<=n;j++)
      fscanf(f1,"%f",&y[j]);
    fscanf(f1,"%f",&t);
    fclose(f1);
  }
 //******************************************************************
 void process()
 {
   int i,j;
    for (i=0;i<=n;i++)
     {
       z[i]=x[i]-t;
       k[i][0]=y[i];
     }
    for (i=0;i<=n;i++)
     for (j=i+1;j<=n;j++)
      k[j][i+1]=(k[i][i]*z[j]-k[j][i]*z[i])/(x[j]-x[i]);
 }
 //******************************************************************
 void output()
 {
   int i,j;
   f2=fopen(fo,"w");
   f3=fopen(fu,"w");
   fprintf(f2,"%.3f",k[n][n]);
   for (i=0;i<=n;i++)
    for (j=0;j<=i;j++)
     {
       fprintf(f3,"%.3f ",k[i][j]);
       if (j==i) fprintf(f3,"\n");
     }
   fclose(f2);
   fclose(f3);
 }
 //******************************************************************
 void main()
 {
  input();
  process();
  output();
 }


File input đầu vào có dạng
user posted image
File output đầu ra cho ta kết quả hàm f(t)
user posted image
Giá trị bảng Ayken dạng 2:
user posted image

QUOTE
P/s:Mấy bài sau anh em cố gắng làm đi, sắp thi rồi đó không khéo th́ :sos  :cuoideu

v2eu - November 23, 2007 04:50 PM (GMT)
GAUSS-SIEDEL

Dữ liệu :

Input : File gausie.inp
- Ḍng đâu : n --> số phương tŕnh
- n ḍng tiếp theo mỗi ḍng (n+1) số - dạng ma trận đầy đủ của hệ
- Ḍng cuối n số : nghiệm ban đầu của hệ

Output: File gausie.out
- Nghiệm của hệ

Ví dụ :

File Input có dạng :

3
10 2 1 10
1 10 2 12
1 1 10 8
0 0 0

Ḍng thứ 3 sô cuối là 12 mới ra nghiệm đúng (trong giáo tŕnh là 10)

CODE

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


#define fi "gausie.inp"
#define fo "gausie.out"

FILE *f1,*f2;

float B[101][101],x[101],y[101]; // ma tran B dong vai tro cua ca 2 ma tran A,B trong giai thuat Gauss-Siedel
int n;

void input()
{
    float r;
    int i;
    f1=fopen(fi,"r");
    f2=fopen(fo,"w");
    fscanf(f1,"%d",&n);
    for (i=1; i<=n; i++)
      for (int j=1; j<=n+1; j++)
        {
           fscanf(f1,"%f",&r);
           B[i][j]=r;
        }
    // Nhap vecto x ban dau
    for (i=1; i<=n; i++) fscanf(f2,"%f",&y[i]);
    fclose(f1);
}

// function doi hang i va hang j
void change_row(int i, int j)
{
    float tg;
    for (int k=1; k<=n+1; k++)
      {
             tg=B[i][k];
             B[i][k]=B[j][k];
             B[j][k]=tg;
      }
}

void check_B()
{
    for (int i=1; i<=n; i++)
    // Neu phan tu A[i][i] trong ma tran nhap vao bang 0 thi doi hang
       if (B[i][i]==0)
         {
            for (int j=1; j<=n; j++)
              if (B[j][i]!=0&&B[i][j]!=0)
               {
                   change_row(i,j);   // doi hang i va hang j cho nhau
                   break;
               }
         }
}

int Build_B_x()
{
    float u,maxi;
    for (int i=1; i<=n; i++)
     {
         B[i][n+1]/=B[i][i];
         x[i]=B[i][n+1];
         maxi=0;
         for (int j=1; j<=n; j++)
           if (j!=i)
             {
                B[i][j]=-B[i][j]/B[i][i];
                maxi+=fabs(B[i][j]);
                x[i]+=B[i][j]*y[j];
             }
         if (maxi>=1) return 0; // Neu khong thoa dieu kien hoi tu thi ham tra ve gia tri 0
         B[i][i]=0;
     }
    return 1; // Ham tra ve gia tri 1 (thoa dieu kien hoi tu)
}

void output()
{
    fprintf(f2,"Nghiem cua he la : ");
    for (int i=1; i<=n; i++) fprintf(f2,"%.3f  ",x[i]);
    fclose(f2);
}

void process()
{
    // Kiem tra A[i][i] khac 0
    check_B();
    // Khoi tao ma tran B _ vecto x
    if (Build_B_x()==0)
      {
         fprintf(f2,"Khong thoa dieu kien hoi tu");
         exit (0);  // Khong thoa dieu kien hoi tu thi thoat ngay
      }
    int t; // Bien t kiem tra sai so cua nghiem khong qua' epsilon = 0.001
    do
     {
         t=0;
         for (int i=1; i<=n; i++)
          {
             y[i]=B[i][n+1];
             for (int j=1; j<=n; j++) y[i]+=B[i][j]*x[j];
             if (fabs(y[i]-x[i])>=0.001) t=1;
             x[i]=y[i];
          }
     }
    while (t);
    output();
}


int main()
{
   input();
   process();
   return 0;
}

v2eu - November 23, 2007 05:13 PM (GMT)
GIẢM DƯ

Dữ liệu :

Input : File giamdu.inp
- Ḍng đâu : n --> số phương tŕnh
- n ḍng tiếp theo mỗi ḍng (n+1) số - dạng ma trận đầy đủ của hệ
- Ḍng cuối n số : nghiệm ban đầu của hệ

Output: File giamdu.out
- Nghiệm của hệ

Ví dụ:

File Input có dạng :

3
10 -2 -2 6
-2 10 -1 7
1 1 -10 -8
0 0 0

Ḍng thứ 4 , số cuối là -8 (trong giáo tŕnh là 8)


CODE

#include <stdio.h>
#include <math.h>

#define fi "giamdu.inp"
#define fo "giamdu.out"

FILE *f1,*f2;

float a[101][101],R[101],x[101],maxR;
int n,pmaxR;

void input()
{
    float r;
    int i;
    f1=fopen(fi,"r");
    f2=fopen(fo,"w");
    fscanf(f1,"%d",&n);
    for (i=1; i<=n; i++)
       for (int j=1; j<=n+1; j++)
        {
          fscanf(f1,"%f",&r);
          a[i][j]=r;
        }
    for (i=1; i<=n; i++) fscanf(f1,"%f",&x[i]);
    fclose(f1);
}

void change_row(int i, int j)
{
    float tg;
    for (int k=1; k<=n+1; k++)
      {
          tg=a[i][k];
          a[i][k]=a[j][k];
          a[j][k]=tg;
      }
}

void Check_A()
{
    for (int i=1; i<=n; i++)
       if (a[i][i]==0)
         {
             for (int j=1; j<=n; j++)
                if (a[i][j]!=0&&a[j][i]!=0)
                  {
                      change_row(i,j); // Doi hang i va hang j cho nhau
                      break;
                  }
         }
}

void Ini_A_R()
{
    maxR=0; // khoi tao Max_R_s = 0
    pmaxR=0; // khoi tao vi tri cua R_s la 0
    for (int i=1; i<=n; i++)
      {
             a[i][n+1]/=a[i][i];
             R[i]=a[i][n+1];
             for (int j=1; j<=n; j++)
               if (j!=i)
                 {
                    a[i][j]/=a[i][i];
                    R[i]-=a[i][j]*x[j];
                 }
             a[i][i]=1;
             R[i]-=x[i];
             if (maxR<fabs(R[i]))
               {
                  maxR=fabs(R[i]);
                  pmaxR=i;
               }
      }
}

void process()
{
    Check_A(); // Kiem tra a[i][i] khac 0
    Ini_A_R(); // Tao ma tran A (voi a[i][i]=1) va vecto R
    int pd; // Bien tam _ dung de luu dong co R[i] lon nhat
    float d; // Bien tam _ dung de luu R[i] lon nhat
    do
      {
         x[pmaxR]+=R[pmaxR];  //Them vao x 1 so gia = R[pmaxR]
         maxR=R[pmaxR];  
         R[pmaxR]=0; d=0;
         for (int i=1; i<=n; i++)
            if (i!=pmaxR)
               {
                  R[i]-=a[i][pmaxR]*maxR;
                  if (d<fabs(R[i])) { d=fabs(R[i]); pd=i; }
               }
         if (d<0.0001) break; // sai so be hon sai so cho phep thi thoat
         maxR=d; pmaxR=pd;
      }
    while (1);
}

void output()
{
    fprintf(f2,"Nghiem cua he phuong trinh la : ");
    for (int i=1; i<=n; i++) fprintf(f2,"%.3f  ",x[i]);
    fclose(f2);
}

int main()
{
   input();
   process();
   output();
   return 0;
}

v2eu - November 25, 2007 05:27 AM (GMT)
T̀M TRỊ RIÊNG, VECTO RIÊNG _ PHƯƠNG PHÁP DANHILEPSKI

Dữ liệu :

Input : File danhilep.inp
- Ḍng đâu : n --> cấp của ma trận vuông A
- n ḍng tiếp theo mỗi ḍng n số - ma trận A nhập vào

Output: File danhilep.out
- Ma trận Phơrêbemit
- Ma trận tích M ( M = M[1].M[2]...M[n-1] )

Ví dụ:

File Input có dạng :

3
2 1 0
1 3 1
0 1 2

File Output có dạng :

Ma tran P (dung de tinh tri rieng)

7 -14 8
1 0 0
0 1 0


Ma tran M (M = M[1].M[2]...M[n-1] dung de tinh vecto rieng)

1 -5 5
0 1 -2
0 0 1


CODE

#include <stdio.h>

#define fi "danhilep.inp"
#define fo "danhilep.out"

#define max 101

FILE *f1,*f2;

float A[max][max],B[max][max],B1[max][max],M[max][max],rM[max][max];
int n;

void input()
{
    float r;
    f1=fopen(fi,"r");
    f2=fopen(fo,"w");
    fscanf(f1,"%d",&n);
    for (int i=1; i<=n; i++)
      for (int j=1; j<=n; j++)
         {
           fscanf(f1,"%f",&r);
           A[i][j]=r;
         }
    fclose(f1);
}

void Mul(float *a, float *b, float *c)
{
    for (int i=1; i<=n; i++)
       for (int j=1; j<=n; j++)
        {
           * (c+i*max+j) = 0;
           for (int k=1; k<=n; k++) (* (c+i*max+j))+=(* (a+i*max+k) ) * (* (b+k*max+j));
        }
}

void process()
{
    for (int e=1; e<=n; e++) B1[e][e]=1;  // Gan B1=E (E la ma tran don vi)
    for (int k=n-1; k>=1; k--)
      {
             // Xay dung ma tran nghich dao cua M va ma tran M
             for (int i=1; i<=n; i++)
               if (i!=k)
                 {
                     for (int j=1; j<=n; j++)
                       if (j!=i)
                         {
                            rM[i][j]=0;
                            M[i][j]=0;
                         }
                     rM[i][i]=1;
                     M[i][i]=1;
                 }
               else
                 {
                   for (int j=1; j<=n; j++)
                    {
                       rM[i][j]=A[k+1][j];
                       if (j==k) M[i][j]=1/A[k+1][k];
                       else M[i][j]=-A[k+1][j]/A[k+1][k];
                    }
                 }
               //  Goi ham nhan 3 lan
               Mul((float *) A,(float *) M,(float *) B);
               Mul((float *) rM,(float *) B,(float *) A);
               Mul((float *) B1,(float *) M,(float *) B);
               // Gan B1=B
               for (int u=1; u<=n; u++)
                  for (int v=1; v<=n; v++) B1[u][v]=B[u][v];
      }
}

void output()
{
    int i,j;
    fprintf(f2,"Ma tran P (dung de tinh tri rieng) \n\n");
    for (i=1; i<=n; i++)
      {
         for (j=1; j<=n; j++) fprintf(f2,"%5.3g  ",A[i][j]);
         fprintf(f2,"\n");
      }
    fprintf(f2,"\n\n");
    fprintf(f2,"Ma tran M (M = M[1].M[2]...M[n-1]  dung de tinh vecto rieng) \n\n");
    for (i=1; i<=n; i++)
      {
         for (j=1; j<=n; j++) fprintf(f2,"%5.3g  ",B[i][j]);
         fprintf(f2,"\n");
      }
    fclose(f2);
}

int main()
{
   input();
   process();
   output();
   return 0;
}

v2eu - November 26, 2007 10:25 AM (GMT)
BẢNG SAI PHÂN _ NỘI SUY NEWTON

Dữ liệu :

Input : File newton.inp
- Ḍng đầu : n --> bậc của đa thức nội suy
- Ḍng thứ 2 gồm (n+1) số - các giá trị x[0],x[1], ... , x[n]
- Ḍng thứ 3 gồm (n+1) số - các giá trị y[0],y[1], ... ,y[n]

Output: File newton.out
- In ra bảng sai phân

Ví dụ:

File Input có dạng :

4
1 2 3 4 5
2 4 5 7 8

File Output có dạng :

Bang sai phan

2
4 2
5 1 -1
7 2 1 2
8 1 -1 -2 -4

CODE

#include <stdio.h>

#define fi "newton.inp"
#define fo "newton.out"

FILE *f;

float a[101][101],x[101];
int n;

void input()
{
    int i;
    float r;
    f=fopen(fi,"r");
    fscanf(f,"%d",&n);
    for (i=0; i<=n; i++) fscanf(f,"%f",&x[i]);
    for (i=0; i<=n; i++)
      {
          fscanf(f,"%f",&r);
          a[i][0]=r;   // y[i] = a[i][0]    
      }
    fclose(f);
}

void process()
{
    for (int i=1; i<=n; i++)
      for (int j=1; j<=i; j++)
         a[i][j]=a[i][j-1]-a[i-1][j-1];
}

void output()
{
    f=fopen(fo,"w");
    fprintf(f,"Bang sai phan \n\n");
    for (int i=0; i<=n; i++)
      {
         for (int j=0; j<=i; j++) fprintf(f,"%5.3g  ",a[i][j]);
         fprintf(f,"\n");
      }
    fclose(f);
}

int main()
{
   input();
   process();
   output();
   return 0;
}




* Hosted for free by InvisionFree