Diễn đàn hỏi đáp học thuật - Download Tài Liệu Miễn Phí
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Diễn đàn hỏi đáp học thuật - Download Tài Liệu Miễn PhíĐăng Nhập

VỮNG TIN - TIẾP BƯỚC - THÀNH CÔNG


descriptionPhương pháp chia đôi tìm nghiệm gần đúng của đa thức EmptyPhương pháp chia đôi tìm nghiệm gần đúng của đa thức

more_horiz
Phương pháp chia đôi tìm nghiệm gần đúng của đa thức f(x) = 0

BÀI TOÁN
Tìm nghiệm gần đúng của đa thức f(x) = 0 với khoảng cách ly nghiệm [a,b] và sai số gần đúng Epxilon.

CODE MẪU

Code:

#include "math.h"
#include "conio.h"
#include "iostream.h"
/*Nhap vao mot da thuc luu he so trong A[] va co Bac*/
double*NhapDaThuc(int Bac) {
   double *A = new double [Bac+1];
   for(int i= 0; i<=Bac; i++) {
      cout<<"a"<<i<<" = ";
      cin>>A[i];
   }
   return A;
}

/*Xuat da thuc co he so A[] va Bac*/
void XuatDaThuc( double*A,int Bac, char*s) {
   cout<<"Da Thuc Vua Nhap la:\n";
   cout<<s<<" = "<<A[0];
   for(int i=1; i<=Bac; i++){
      if(A[i]>0) {
         cout<<" + "<<A[i]<<"x^"<<i;
      }
      if(A[i]<0) {
         cout<<A[i]<<"x^"<<i;
      }
   }
}

/*Tinh gia tri cua da thuc tai diem x*/
/*Su dung luoc do hoocner*/
double f(double*A, int Bac, double x) {
    double KetQua = A[Bac];
   for(int i=Bac-1; i>=0; i--)
      KetQua=KetQua*x + A[i];
   return KetQua;
}
/*Phuong phap chia doi*/
double PPChiaDoi(double*A, int Bac, double a, double b, double Epxilon){
   double c=(b+a)/2, E = fabs(b-a);
   while(E>Epxilon){
      if(f(A,Bac,a)*f(A,Bac,c)<=0)
         b = c;
      else
         a = c;
      E = fabs(b -a);
      c = (b + a)/2;
   }
   return a;
}
/*Chuong Trinh Chinh*/
void main(){
   clrscr();
   double*Fx,a,b,Epxilon;
   int n;
   cout<<"Nhap Vao Bat Cua Phuong Trinh:";
   cin>>n;
   Fx = NhapDaThuc(n);
   XuatDaThuc(Fx,n,"f(x)");
   cout<<"\nNhap Khoang Cach Ly Nghiem [a,b]:\n";
   cout<<"a = ";
   cin>>a;
   cout<<"b = ";
   cin>>b;
   cout<<"Nhap Sai So Gan Dung Epxilon: ";
   cin>>Epxilon;
   cout<<"Nghiem x = "<<PPChiaDoi(Fx,n,a,b,Epxilon);
   getch();
   delete Fx;
}

descriptionPhương pháp chia đôi tìm nghiệm gần đúng của đa thức EmptyÝ TƯỞNG CÀI ĐẶT PHÁP CHIA ĐÔI

more_horiz
- Dữ liệu đầu vào: Cho phương trình f(x)=0 và [a,b] là khoảng phân ly nghiệm với sai số gần đúng cho trước Epxilon.

- Ý tưởng của phương pháp: chọn c = (a+b)/2 là điểm giữa của [a,b] như vậy sẽ tồn tại một khoảng phân ly nghiệm nhỏ hơn (hoặc [a,c] hoặc [c,b]). Nếu f(a).f(c)<0 thì ta gán b=c (vì [a,c] là khoảng phân ly nghiệm), ngược lại a=c (vì [c,b] là khoảng phân ly nghiệm). Mục đích cuối cùng của phương pháp là làm cho khoảng phân ly nghiệm [a,b] càng gần với nghiệm thực của phương trình. Cho nên, ta tiếp tục chia đôi [a,b] cho đến khi sai số E=|b-a|
- Lưu đồ giải thuật:
Phương pháp chia đôi tìm nghiệm gần đúng của đa thức Pp_chi10

descriptionPhương pháp chia đôi tìm nghiệm gần đúng của đa thức EmptyRe: Phương pháp chia đôi tìm nghiệm gần đúng của đa thức

more_horiz
CÀI ĐẶT CÁC HỆ SỐ CỦA ĐA THỨC LÀ PHÂN SỐ

Code:

#include "conio.h"
#include "stdio.h"
#include "math.h"
#include "iostream.h"

typedef struct Diem{
   long x;
   long y;
}Diem;

typedef struct PhanLy{
   int n;
   double*a;
   double*b;
}PhanLy;

typedef struct PhanSo{
   long MauSo;
   long TuSo;
}PhanSo;

/*Lay toa do x tai vi tri cursor*/
unsigned char getx(){
   unsigned char x;
   asm{
      mov ah,3
      mov bh,0
      int 10h
      mov x,dl
   }
   return x;
}

/*Lay toa do y tai vi tri cursor*/
unsigned char gety(){
   unsigned char y;
   asm {
      mov ah,3
      mov bh,0
      int 10h
      mov y,dh
   }
   return y;
}

/*Lay toa do (x,y) tai vi tri cursor*/
Diem getxy(){
   Diem Temp;
   unsigned char x,y;
   asm{
      mov ah,3
      mov bh,0
      int 10h
      mov y,dh
      mov x,dl
   }
   Temp.x = x;
   Temp.y = y;
   return Temp;
}

/* Uoc so chung lon nhat*/
long UCLN(long a, long b){
   while( a!=b){
      if(a>b)
         a-= b;
      else
         b-= a;
   }
   return a;
}

/*---------------PHEP TOAN TREN PHAN SO----------------*/

/*Rut gon phan so*/
PhanSo RutGon(PhanSo PS){
   if (PS.TuSo!=0) {
      long k = UCLN(abs(PS.TuSo),PS.MauSo);
      PS.MauSo = long(PS.MauSo/k);
      PS.TuSo = long(PS.TuSo/k);
   }
   return PS;
}

PhanSo KhoiTao(long x, long y) {
   PhanSo Temp;
   if (y<0) {
      Temp.TuSo = -x;
      Temp.MauSo = -y;
   }
   if( y>0 ) {
      Temp.TuSo = x;
      Temp.MauSo = y;
   }
   if (y==0){
      Temp.TuSo = 0;
      Temp.MauSo = 1;
   }
   return RutGon(Temp);
}


PhanSo Cong(PhanSo A, PhanSo B){
   PhanSo Temp;
   Temp.TuSo = A.TuSo*B.MauSo+A.MauSo*B.TuSo;
   Temp.MauSo = A.MauSo*B.MauSo;
   Temp = RutGon(Temp);
   return Temp;
}

PhanSo Nhan(PhanSo A, PhanSo B){
   PhanSo Temp;
   Temp.TuSo  = A.TuSo*B.TuSo;
   Temp.MauSo = A.MauSo*B.MauSo;
   Temp = RutGon(Temp);
   return Temp;
}
PhanSo Nhan(PhanSo A, long n){
   PhanSo Temp;
   Temp.TuSo  = A.TuSo*n;
   Temp.MauSo = A.MauSo;
   Temp = RutGon(Temp);
   return Temp;
}

PhanSo Chia(PhanSo A, long n){
   PhanSo Temp;
   if ( n<0 ) {
      Temp.TuSo  = -A.TuSo;
      Temp.MauSo = -A.MauSo*n;
   } else {
      Temp.TuSo  = A.TuSo;
      Temp.MauSo = A.MauSo*n;
   }
   Temp = RutGon(Temp);
   return Temp;
}

PhanSo Chia(PhanSo A, PhanSo B){
   PhanSo Temp;
   Temp.TuSo  = A.TuSo*B.MauSo;
   Temp.MauSo = A.MauSo*B.TuSo;
   Temp = RutGon(Temp);
   return Temp;
}

long double Real(PhanSo A){
   long double x,y;
   x = A.TuSo;
   y = A.MauSo;
   return (x/y);
}

/*-------------------NHAP XUAT PHAN SO--------------------*/

PhanSo NhapPhanSo(long i){
   PhanSo PS;
   double k;
   cout<<"\na"<<i<<" = ";
   cin>>k;
   PS.TuSo = long(k);
  Lap:
   cout<<"b"<<i<<" = ";
   cin>>k;
   if ( k==0 ) {
      gotoxy(1,gety());
      cout<<"Nhap Lai ";
      goto Lap;
   }
   PS.MauSo = long(k);
   if(PS.MauSo<0) {
      PS.MauSo = -PS.MauSo;
      PS.TuSo = -PS.TuSo;
   }
   PS = RutGon(PS);
   return PS;
}

PhanSo NhapPhanSo(){
   PhanSo PS;
   double k;
   cout<<"\nTu So = ";
   cin>>k;
   PS.TuSo = long(k);
  Lap:
   cout<<"Mau So = ";
   cin>>k;
   if ( k==0 ) {
      gotoxy(1,gety());
      cout<<"Nhap Lai ";
      goto Lap;
   }
   PS.MauSo = long(k);
   if(PS.MauSo<0) {
      PS.MauSo = -PS.MauSo;
      PS.TuSo = -PS.TuSo;
   }
   PS = RutGon(PS);
   return PS;
}

void XuatPhanSo(PhanSo PS, long x, long y){
      if (PS.MauSo== 1) {
      gotoxy(x,y+1);
      cout<<PS.TuSo;
      }else
      {
   if(PS.TuSo < 0) {
      gotoxy(x,y+1);
      cout<<" - ";
      x+=3;
      gotoxy(x,y);
      cout<<-PS.TuSo;
   }
   else    {
      gotoxy(x,y);
      cout<<PS.TuSo;
   }
   long x_ = getx();
   gotoxy(x,y+2);
   cout<<PS.MauSo;
   long x1_ = getx();
   if (x_<x1_) x_ = x1_;
   gotoxy(x,y+1);
   for(int i=x;i<=x_;i++)
      cout<<"-";
    }
};

void XuatPhanSo(PhanSo PS){
   int x = getx()+1;
   int y = gety();
      if (PS.MauSo== 1) {
      gotoxy(x,y+1);
      cout<<PS.TuSo;
      }else
      {
   if(PS.TuSo < 0) {
      gotoxy(x,y+1);
      cout<<" - ";
      x+=3;
      gotoxy(x,y);
      cout<<-PS.TuSo;
   }
   else    {
      gotoxy(x,y);
      cout<<PS.TuSo;
   }
   int x_ = getx();
   gotoxy(x,y+2);
   cout<<PS.MauSo;
   int x1_ = getx();
   if (x_<x1_) x_ = x1_;
   gotoxy(x,y+1);
   for(int i=x;i<=x_;i++)
      cout<<"-";
    }
};

/*-------------------XU LY DA THUC-------------------------*/
void NhapDaThuc(PhanSo*A, int Bac) {
   int x,y;
   for(int i= 0; i<=Bac; i++) {
      cout<<"\n\t\ta"<<i<<"/b"<<i<<"=";
      x = getx();
      y = gety();
      A[i] = NhapPhanSo(i);
      XuatPhanSo(A[i],x+2,y);
      cout<<endl<<endl;
   }
}

/*Xuat da thuc co he so A[] va Bac*/

void XuatDaThuc(PhanSo*A,int Bac, char*s) {
   int x,y;
   y = gety();
   cout<<s<<" = ";
   x = getx()+1;
   XuatPhanSo(A[0],x,y);
   for(int i=1; i<=Bac; i++){
      if(A[i].TuSo>0) {
         x = getx()+1;
         gotoxy(x,y+1);
         cout<<" + ";
         x = getx()+1;
         XuatPhanSo(A[i],x,y);
         x = getx()+1;
         gotoxy(x,y+1);
         cout<<"x^"<<i;
      }
      if(A[i].TuSo<0) {
         x = getx()+1;
         XuatPhanSo(A[i],x,y);
         x = getx()+1;
         gotoxy(x,y+1);
         cout<<"x^"<<i;
      }
   }
}

PhanSo f(PhanSo*A,long Bac, PhanSo x){
   PhanSo Temp = A[Bac];
   for(int i = Bac-1; i>=0;i--) {
      Temp = Nhan(Temp,x);
      Temp = Cong(Temp,A[i]);
   }
   Temp = RutGon(Temp);
   return Temp;
}
/*-------------------CAC THUAT TOAN CO BAN--------------------*/

PhanSo PPChiaDoi(PhanSo*A,int Bac,PhanSo a, PhanSo b, PhanSo Epxilon){
   PhanSo c,temp,E;
   PhanSo fa,fc;
   do {
      c = Cong(a,b);
      c = Chia(c,2);
      fa = f(A,Bac,a);
      fc = f(A,Bac,b);
      temp = Nhan(fa,fc);
      if (temp.TuSo<0)
         b = c;
      else
         a = c;
      E = Cong(b,Nhan(a,-1));
   } while(fabs(Real(E))>fabs(Real(Epxilon)));
   return a;
}

void main(){
   clrscr();
   PhanSo * Fx;

   long n;
   cout<<"Nhap vao bac cua da thuc:";
   cin>>n;
   Fx = new PhanSo[n+1];
   cout<<"\nNhap cac he so huu ti cua da thuc.\n";
   NhapDaThuc(Fx,n);
   cout<<"\nDa Thuc Vua Nhap la:\n\n";
   XuatDaThuc(Fx,n,"f(x)");


   PhanSo a = KhoiTao(0,1);
   PhanSo b = KhoiTao(1,1);
   PhanSo Epxilon = KhoiTao(1,1000);

   PhanSo k = PPChiaDoi(Fx,n,a,b,Epxilon);
   cout<<"\n\n Nghiem x =";
   XuatPhanSo(k);
   cout<<" nghiem thuc  x = "<<Real(k);

   delete Fx;
   cout<<endl;
   getch();
}

descriptionPhương pháp chia đôi tìm nghiệm gần đúng của đa thức EmptyRe: Phương pháp chia đôi tìm nghiệm gần đúng của đa thức

more_horiz
privacy_tip Permissions in this forum:
Bạn không có quyền trả lời bài viết
power_settings_newLogin to reply