Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Giải pt phi tuyến tính bằng pp chia đôi ntn nhỉ?

  1. #1
    Ngày gia nhập
    02 2009
    Nơi ở
    http://toptaigamemienphi.com
    Bài viết
    76

    Mặc định Giải pt phi tuyến tính bằng pp chia đôi ntn nhỉ?

    Giải pt phi tuyến tính.Mình giải theo phuơng pháp chia đôi.sao mãi vẫn vô nghiệm lạ thật.Phần thuật giải này mình hay bị nhầm lẫn .Mọi người xem qua thử coi.
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    void main()
    {
     float fc=0,fa=0,fb=0,a,x,c,b,d;
     int n,i;
     printf("\nbac cua da thuc:");
     scanf("%d",&n);
     printf("\nNhap khoang cach ly[a,b]:");
     scanf("%f%f",&a,&b);
     c=(a+b)/2;
     printf("\nNhap cac he so:");
     for (i=n;i>=0;i--)
       {
        printf("\nso d%d la",i);
        scanf("%f",&d);
        fc+=d*pow(c,i);
        fa+=d*pow(a,i);
        fb+=d*pow(b,i);
       }
       printf("\nfa:%f",fa);
       printf("\nfb:%f",fb);
       printf("\nfc:%f",fc);     /*thu gia tri xem dung ko.ko can thiet*/
     if (fc==0) printf("\nPt co nghiem:%f",c);
     else if (fa*fc>0)
        a=c;
     else if (fb*fc>0)
        b=c;
     else
      printf("\nPhuong trinh vo nghiem");
      getch();
    }
    Thư viện tài liệu miễn phí
    * Không cần đăng ký thành viên
    * Tải không giới hạn tài liệu
    * Số lượng tài liệu trên 1 triệu
    * Miễn phí và không mất tiền khi tải về
    Website: http://tailieuhay.info

  2. #2
    Ngày gia nhập
    01 2009
    Nơi ở
    Hà Nội
    Bài viết
    205

    Code của bạn không sai mới lạ, nếu đúng được thì thật là... may mắn.

    Phương pháp này là phương pháp chia đôi, mình đoán không lầm thì phương pháp này vận dụng tư tưởng của định lý "dãy đoạn bao nhau" hay "dãy đoạn thắt dần" trong môn giải tích của nhà toán học Cantor. Mình hiểu rất rõ định lý này : chia đôi đoạn [a,b] n lần đến khi nào thỏa mãn yêu cầu bài toán (ở đây là f(x) = 0). Do đó phải thực hiện nhiều lần mới cho kết quả chính xác được => bạn phải sử dụng vòng lặp mới được.

    Lưu ý:
    Bạn phải kiểm tra điều kiện sau trước khi dùng vòng lặp : f(a)*f(b)<=0 ? Có nghiệm thuộc [a,b] : Vô nghiệm trong [a,b]

    Ngoài ra bạn có thể sử dụng PP lặp nghiệm Newton để giải quyết bài toán này. Hơn nữa, cái tối ưu khi sử dụng thuật toán là phải tìm được tất cả các nghiệm có trong [a,b] chứ không phải chỉ ra 1 nghiệm. Có lẽ đây chính là nhược điểm lớn nhất của PP chia đôi này.

  3. #3
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Nếu có hàm trước và nhập đoạn [a,b] trước thì có thể làm như này:

    C Code:
    1. float func(float x)
    2. {
    3.     return <Nội dung cái hàm cho trước tại đây>;
    4. }
    5.  
    6. //Phương pháp chia đôi
    7. float Calculative(float a, float b)
    8. {
    9.     float t;
    10.     do
    11.     {
    12.         t = (a+b)/2;
    13.         if (func(t)>0) b=t;
    14.         if (func(t)<0) a=t;
    15.     } while (func(t) < -0.0001 || func(t) > 0.0001);
    16.     return t;
    17. }

  4. #4
    Ngày gia nhập
    03 2009
    Bài viết
    16

    Code:
    cái tối ưu khi sử dụng thuật toán là phải tìm được tất cả các nghiệm có trong [a,b]
    Nhờ bạn trubavuong viết hộ code bài này mình tham khảo với được không bạn. Được thế thì cám ơn bạn rất nhiều.
    C++ Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4.   int i, n;
    5.   float x, ma[30], S, s, a, b, c, e, eps;
    6.  
    7. float f(float x)
    8. {
    9.   S=ma[n];
    10.   for (i=n; i>0; i--)
    11.       S=S*x + ma[i-1];
    12.   return S;
    13. }
    14. float F(float x)  
    15. {
    16.   float b[30];
    17.   s=n*ma[n];
    18.   for (i=n-1; i>0; i--)
    19.   {
    20.      b[i]=i*ma[i];
    21.      s=s*x + b[i];
    22.   }
    23.   return s;
    24. }
    25. void main()
    26. {
    27.   clrscr();
    28.   printf("\nChuong trinh tim nghiem cua da thuc bac n nhap tu ban phim\n");
    29.   printf("\nNhap bac cua da thuc can tinh n = ");
    30.   scanf("%d", &n);
    31.   printf("\nNhap vao khoang phan li nghiem a<=x<=b");
    32.   printf("\n  a = ");   scanf("%f",&a);
    33.   printf("\n  b = ");   scanf("%f",&b);
    34.   printf("\nNhap vao sai so epsilon = ");   scanf("%f",&eps);
    35.   printf("\nNhap vao cac he so tu a[%d] den a[0] cua da thuc\n",n);
    36.  
    37.   for (i=n; i>=0; i--)
    38.      { printf("\n  a[%d] = ",i); scanf("%f",&ma[i]);}
    39.   if (F(a)*F(b)>0)
    40.   {
    41.      printf("\n Phuong trinh vo nghiem");
    42.      getch(); return;
    43.   }
    44.   do {
    45.        c=(a+b)/2;
    46.  
    47.        if (f(c)*f(a)==0)
    48.        {
    49.      printf("\nPhuong trinh co nghiem x = ");
    50.      f(c)==0?  printf("%f",c): printf("%f",a);
    51.      getch();
    52.      return;
    53.        }
    54.        (f(c)*f(a)<0)?(b=c):(a=c);
    55.        e=b-a;
    56.   }
    57.   while (e>=eps);
    58.  
    59.   printf("\nPhuong trinh: %6.2f *x^%d + %6.2f *x^%d + ... + %6.2f = 0",ma[n],n,ma[n-1],n-1,ma[0]);
    60.   printf("\nCo nghiem trong khoang phan li nghiem da cho la: x = %f",c);
    61.   getch();
    62. }

  5. #5
    Ngày gia nhập
    05 2012
    Bài viết
    1

    Mặc định Giải phương trình Phi Tuyến bằng phương pháp Newton

    Mình cũng làm thử theo phương pháp Newton nhưng vẫn không hiểu tại sao chỉ nhập được x0 thì không chạy tiếp được nữa. Nhờ mọi người xem qua giúp mình một chút. Thanks all!!!
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    /*--------------------------Tinh dao ham bac 1------------------------
    
    --------*/
    float Dham(float x)
    {
    	float p=0; float h[10]; int i;int n;
    	for(i=n; i>=2; i--)
    	p=p+i*h[n-i]*pow(x,i-1);
    	return p+h[n-1];
     }
     /*-------------------------Tinh dao ham bac 2------------------------
    
    --------*/
     float Dham2(float x)
     {
     	float p=0; float h[10]; int i; int n;
     	for(i=n; n>=3; i--)
     	p=p+i*(i-1)*h[n-i]*pow(x,i-2);
     	return p+(h[n-2]*(n-1));
     }
    /*-------------------------Tinh gia tri cua Ham(x)--------------------
    
    --------*/
    float Ham(float x)
    {
    	float p=0;  int i; int n; float h[10];
     	for(i=n; i>=0; i--)
      	p=p+h[n-i]*pow(x,i);
    	return p;
    }
    /*--------------------------------------------------------------------
    
    --------*/
    void main()
    {
    int i,d1,d2;
    float x0,epsi;
    float *a,t,n;
    float x[10],h[10];
    
    printf("\n GIAI PHUONG TRINH PHI TUYEN BANG PHUONG PHAP TIEP TUYEN");
    printf("\n                         ----------                     ");
    printf("\n ");
    printf("\n ");
    printf("\n Nhap vao bac cua ham: ");
    scanf("%f,",&n);
    printf("\n Nhap vao cac he so cua ham: ");
    for (i=0; i<=n; i++)
    	{
    	    printf("\n h[%d]=",i);
    	    scanf("%f",&h[i]);
     	}
    printf("\n Nhap vao khoang phan ly nghiem [d1,d2]: ");
    printf("\n Nhap vao d1: ");
    scanf("%f",&d1);
    printf("\n Nhap vao d2: ");
    scanf("%f",&d2);
    do
    	{
    		printf("\n Nhap vao x0 thuoc khoang [d1,d2]=:");
    		scanf("%f",&x[0]);
    	}
    while((Ham(x[0])*Dham2(x[0]))<=0);
    
    printf("\n Nhap vao sai so epsilon =:");
    scanf("%f",&epsi);
    i = 1;
    x[i] = x0;
    do
    	{
    	x[i+1] = x[i] -Ham(x[i])/Dham(x[i]);
    	t = pow(fabs(x[i+1] - x[i]),2);
    	x[i] = x[i+1];
    	i++;
    	if (i>100) 
    printf("\n Bai toan khong hoi tu! ");
    	}
    while(fabs(t) > epsi);
    printf("\n Nghiem gan dung x* = %f",x[i]);
    printf("\n ");
    printf("\n Gia tri ham = %f",Ham(x[i]));
    printf("\n ");
    getch();
    }

Các đề tài tương tự

  1. Thuật toán C cài đặt hàng đợi dùng mảng một chiều (cài đặt hàng đợi tuyến tính bằng mảng )
    Gửi bởi ducnhat trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 4
    Bài viết cuối: 08-01-2013, 10:48 AM
  2. Cách truyền mang 1 chiều cho hàm bài con trỏ và mảng một chiều ai có thể giải thích giúp mình
    Gửi bởi biencute trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 21-03-2012, 09:00 AM
  3. Lời giải bài tập: Chuỗi Ký tự, mảng số nguyên 1 chiều, mảng 2 chiều, tạo Menu
    Gửi bởi xuanngoc trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 15-10-2011, 01:17 AM
  4. Code kiểm tra lược đồ quan hệ có nguy cơ xảy ra mâu thuẫn tuyến tuyến tính và phi tuyến
    Gửi bởi computerline trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 13-05-2011, 03:56 PM
  5. thuật toán tuyến tính trên mảng 2 chiều trong 2 trường hợp
    Gửi bởi orchidshl1 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 04-04-2011, 11:28 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn