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

Đề tài: Bài tập tính sin(x) bằng C

  1. #1
    Ngày gia nhập
    09 2006
    Nơi ở
    Hà Nôi
    Bài viết
    10

    Talking Bài tập tính sin(x) bằng C

    Hôm trước ông thầy giao cho mình mấy bài tập mình mới làm đc một ít còn mấy bài khoai quá nghĩ mãi không ra. Hôm nay post lên hi vọng nhân đc sự giúp đỡ của mọi người ( gợi ý thôi cũng đc )

    sin(x)=x-(x^3)/(3!)+(x^5)/(5!)+...+((-1)^n)*(x^(2*n-1))/((2*n+1)!)

    mình bí ở chỗ tính giai thừa của (2*n+1) không biết phải dùng vòng lặp for như thế nào cho đúng.

    và tính tích phân từ 0->1 của

    ((sin(x))^2)/(e^x)

    Hơi rối mắt một chút mọi người thông cảm cho mình nhe!!!!!!

    P/s: Mình định hỏi Pete nhưng mấy hôm nay online không thấy Pete đâu.Chắc dạo nay Pete bận quá chăng??

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Bạn xem qua bài này xem.

    Tính Sin theo taylor

    Hoàn toàn tương tự và hoàn toàn có thể đáp ứng được yêu cầu của bạn nhưng có điều nó không thể nhập một số x bất kỳ.

    Chúc may mắn.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    No Avatar
    buianhtuanhn Khách

    nếu không muốn thử bằng function bạn thử đoạn code này xem sao
    C Code:
    1. #include "stdio.h"
    2. #include "conio.h"
    3. void main()
    4.  
    5. {
    6.     int i;
    7.    for (i=1;i<100;i++)
    8.    {
    9.    printf("%d ",i);
    10.    j=i*2+1;
    11.    }
    12.  
    13.    getch();
    14. }

    đoạn trên đã đưa được các số 2*i+1 rồi còn lại tùy bạn xử lý
    Đã được chỉnh sửa lần cuối bởi buianhtuanhn : 16-12-2006 lúc 11:21 PM.

  4. #4
    No Avatar
    se7ensense7en Khách

    Thực ra thì trong trường hợp này mình nghĩ không nên dùng một hàm riêng để tính giai thừa do sẽ phát sinh chi phí vô ích rất lớn. Ví dụ:

    3! = 2 * 3
    5! = 2 * 3 * 4 * 5

    Trong khi 5! có thể biểu diễn bằng 3! * 4 * 5 và tương tự cho 7! = 5! * 6 * 7

    Hix, ngoài ra bài này còn rất nhiều vấn đề mà đáng chú ý nhất là hiện tượng tràn số (ai xài kiểu short, int, long, long int sẽ nhanh chóng bị overflow thôi). Mấy bài này chủ yếu tính toán bằng tay cho vui chớ tính trên máy thì ---> nan giải.

  5. #5
    No Avatar
    dataviettoan Khách

    có gì khó đâu bạn
    bạn dùng thử nhé!
    int giaithua(int n)
    {
    int j=1;
    for(int i=1;i<=2*n+1;i++)
    j=i*i;
    return j;
    }

  6. #6
    Ngày gia nhập
    09 2006
    Nơi ở
    Hà Nôi
    Bài viết
    10

    Mặc định Bài tập tính sin(x) bằng C

    thanks các bạn nhiều! (quái lạ sao lúc mình search trên forum sao không thấy bài này nhỉ)
    Thế còn bài tính giai thừa bác Dreaminess giúp em nốt đi!!

  7. #7
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Hôm nay nhìn lại mới thấy, bạn chú ý đặt tiêu đề cho rõ ràng nhé. Không khó khăn chứ?

    Đúng như se7 nói, đối với bài này bạn không nên tạo ra một hàm tính giai thừa riêng, như thế chi phí tốn kém.

    Nói về bài này:

    Bạn có thể thấy như sau:

    Đặt ex=(x*x)/(2n*(2n-1)) khi đó:

    Khi n=0 thì sin=x;
    Khi n=1 thì sin=x-x*ex
    Khi n=2 thì sin=x-x*ex+ x*ex*ex
    ....

    Nói thêm một chút:
    x chỉ cần thuộc [0..2pi], một giá trị lượng giác x bất kỳ có thể biến đổi về [0..2pi] trong khi tính toán với các hàm lượng giác.
    Hàm sin có miền giá trị thuộc [-1..1], do đó miền của x chỉ cần nằm trong [-pi/2 ..pi/2]. Qua nhận xét này bạn có thể thấy là bạn sẽ tính được sin của một giá trị x bất kỳ. Không phù phiếm chút nào cả. Phải không nào?

    Bây giờ nói về chương trình: Qua những nhận xét trên bạn sẽ viết được chương trình ngắn gọn như sau:

    Code:
    Lh=x;Sin=x;n=1;
    while(abs(Lh)>=0E+06)
    {
       Lh=-Lh*ex; //ex đã nói ở trên.
       Sin+=Lh;
       n++;
    }
    Tất nhiên là muốn tính cho một giá trị x bất kỳ thì cần biến đổi một chút, phần này nhường cho bạn đó. OK?
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Nhận xét về bài của Dreaminess chút nha:
    Đặt ex=(x*x)/(2n*(2n-1))
    Sai, phải là ex = (x * x) / (2*i) / (2*i+1)
    Khi n=0 thì sin=x;
    Khi n=1 thì sin=x-x*ex
    Khi n=2 thì sin=x-x*ex+ x*ex*ex
    ....
    Viết thế này hơi khó hình dung, mình sửa thế này nhé:
    Khởi tạo: sinx = x;
    i = 1: sinx += x * ex^1;
    i = 2: sinx -= x * ex^2;
    i = 3: sinx += x * ex^3; ...
    Code thế này xem ok ko nhé, ko xét trường hợp lỗi do tràn số, chỉ xét thuật toán thôi nha:
    Code:
    double sinx = x;
    for (int i = 1; i <= n; ++i){
        if ((i%2)!=0) sinx += x * pow(ex,i);
        else sinx -= x * pow(ex,i);
    }

  9. #9
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Kha kha, Dreaminess dùng biến chạy là n mà để cho nó giống với cái công thức trong toán đó.

    Dù sao cũng cảm ơn huynguyen nhiều nhé. Chúc giáng sinh vui vẻ.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

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