Đại học Lê Quý Đôn - 236 Hoàng Quốc Việt - Hà Nội

Chia sẻ kiến thức mọi mặt của các lớp cao học CNTT, Học viện Kỹ thuật Quân sự




Chào mừng đã đến với forum khmt.123.st
  • Bạn chưa đăng kí (hoặc chưa đăng nhập) nên quyền lợi của bạn sẽ bị hạn chế. Việc đăng kí làm thành viên hoàn toàn miễn phí, sau khi đăngkí bạn có thể post bài, tham gia thảo luận , nhìn thấy link ở những box hạn chế ... và rất nhiều quyền lợi khác. Thủ tục đăng kí rất nhanh chóng và đơn giản, hãy Đăng kí làm thành viên !
  • Nếu bạn quên mật khẩu, xin nhấn vào đây !
  • Nếu bạn gặp trục trặc trong vấn đề đăng kí hoặc không thể đăng nhập, hãy liên hệ với chúng tôi.




  • Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down  Thông điệp [Trang 1 trong tổng số 1 trang]

    Admin

    Admin
    Quản trị viên
    Quản trị viên
    Bài thầy cho:
    Cho hàm số f(x) liên tục trong khoảng [a, b] biết f(a) *f(b) <0.
    Viết thủ tục tìm nghiệm gần đúng trong khoảng [a, b]
    Ý tưởng:
    Xét hàm f(x) = đó.
    Bây giờ ta coi điểm c là điểm giữa của đoạn [a,b], với c=(a+b)/2
    A0|__________________________________|_________________________________|B0
    C
    A1|__________________________________| B1
    A2|_________________| B2
    A3|________| B3
    ...
    An|_| Bn
    Nguyên tắc xét như sau:
    Vì tích của 2 giá trị f(a) và f(b) luôn nhỏ hơn 0 nên ta có 1 giá trị là dương, giá trị kia phải là âm.
    Mà hàm lại liên tục trên đoạn AB, nên nếu lấy 1 điểm C trên đoạn đó thì f(c) thuộc 1 trong 3 giá trị:
    - Nếu bằng 0: thì c chính là nghiệm, thoát luôn khỏi vòng tìm kiếm.
    - Nếu dương hoặc âm xét đoạn mới A1B1 là 1 nửa đoạn AB. Tức là:
    + ngược dấu với f(a) thì xét đoạn mới A1 B1 là đoạn AC (điểm A1 giữ nguyên là A, điểm B1 là C). Ngược lại, xét đoạn CB (Điểm A1 gán là C, điểm B giữ nguyên).
    Lặp lại cho đến khi đoạn AnBn có sai số bằng Epsilon, thì dừng lại. Có thể giải bằng đệ quy như Mr.Lê Đình S. Ở đây là cách giải thông thường.
    Viết thủ tục:
    Function SaiSo (a, b);

    ‘Định nghĩa theo yêu cầu bài toán

    Case YeuCau of

    Sai số theo miền nghiệm: x=/b -a/;

    Sai số theo miền giá trị hàm số:x = /f(b) - f(a)/;

    ELSE x=/b - a/*/f(b) - f(a)/

    Return SaiSo=x;



    Sub TimNghiem (a, b: real);

    Repeat



    IF f(c) = 0 then Exit vòng lặp


    ELSE

    IF f(a)*f(c) < 0 then b:=c;



    Else a: = c;

    c:=(a+b)/2;
    Until f(c) = 0 OR SaiSo(a,b) <= Epsilon)
    Output
    “f(x) có một nghiệm gần đúng là:”, c.



    Được sửa bởi Admin ngày Sun Jul 03, 2011 10:12 pm; sửa lần 1.

    https://khmt.123.st

    mrP

    mrP
    Thành viên cao cấp
    Thành viên cao cấp
    Theo tôi ý tưởng như thế là đúng rồi, nhưng nên gán c:=(a+b)/2 trước khi xét các trường hợp.
    - Điều kiện thoát khỏi vòng lặp chắc không cần xét tới f(c) = 0 nữa.
    - Trong trường hợp cần tính thêm sai số của hàm số thì thêm điều kiện |f(b)-f(a)| < e nữa.

    Admin

    Admin
    Quản trị viên
    Quản trị viên
    Ừ, nếu vòng lặp đầu tiên mà c=0, nếu c không thuộc đoạn [a, b] thì oan gia mất 1 vòng. Nhưng nếu gán lên đầu thì khi có điều kiện đúng ta sẽ không tóm được giá trị c, thậm chí tóm sai.

    https://khmt.123.st

    mrP

    mrP
    Thành viên cao cấp
    Thành viên cao cấp
    Không có ai vào chém gió à? :\
    Anh em vào đây thì cũng phải làm một bãi để xem những người khác nói đúng hay sai chứ.

    - Nói lại với bác Cường c:=(a+b)/2 là thuộc đoạn [a, b]. Khi f(c)=0 thì thoát khỏi vòng lặp, do đó không thể tóm trượt được.
    - Còn nữa, trong thủ tục trên đâu tiên bác gán c = ???, em không thấy rõ điều này.
    - Nếu bác thấy không đúng, chiều lên lớp ta bàn tiếp. Sau khi ổn rồi thì bác delete commend của em đi nhé.

    hungbeo_fm2008

    hungbeo_fm2008
    Chuyên viên
    Chuyên viên
    mrP đã viết:Không có ai vào chém gió à? :\
    Anh em vào đây thì cũng phải làm một bãi để xem những người khác nói đúng hay sai chứ.
    Đây, thích một bãi thì em cho bác một bãi to luôn. :D
    - Nếu bác gán giá trị c trước khi vào so sánh thì sau khi so sánh rồi, giá trị c:= ??.
    - Thủ tục đầu tiên của bác Cường chỉ là tính sai số, ko liên quan gì đến tính c mà cần gán c. ~)

    LeVanDat

    avatar
    Chuyên viên
    Chuyên viên
    Tôi thấy đề thầy ra là chưa rõ ràng, còn có điểm mập mờ. Chẳng hạn như hàm số f(x) liên tục trên đoạn (a, b) là chưa đủ. Vì có thể trên khoảng này pt có nhiều nghiệm. Như vậy để chặt chẽ với ý tưởng của đ/c Son và một số đ/c khác ta nên:
    - trước khi viết thủ tục, đưa ra đ/k là không mất tính tổng quát, giả định rằng hàm số f(x) là liên tục tăng hoặc liên tục giảm trong khoảng (a,b). Như vậy ta chỉ cần tìm được 1 nghiệm duy nhất của bài toán. Thế là xong.
    - Còn xét với các trường hợp của esilon thì cứ thế mà chèn điều kiện vào để thoát khỏi vòng lặp. Chú ý là việc xét trên cả miền giá trị và miền xác định.
    Lê Văn Đạt

    Admin

    Admin
    Quản trị viên
    Quản trị viên
    Làm thế này theo đệ quy thầy giao, liệu có ngắn quá không? Ở
    đây sai sô tuỳ theo yêu cầu của đề bài mà viết thêm vào.


    Function Tim (a, b: giá trị): Giá trị nghiệm thoả mãn điều kiện;

    g:=(a+b)/2













    IF f(g)=0 OR SaiSo<=Epsilon THEN return g



    ELSE IF f(g)*f(a)<0 THEN Tim (a,g);





    ELSE Tim (a,g);







    End.










    https://khmt.123.st

    Sponsored content


    Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang  Thông điệp [Trang 1 trong tổng số 1 trang]

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

     

    Ghi rõ nguồn khi copy các bài viết từ Website này.
    Bản quyền thuộc Khoa học Máy tính. Số lượt truy cập tính đến hiện tại:Website counter
    Modified skin by Nguyễn Anh Cường. Developed by Members of https://khmt.123.st

    Free forum | ©phpBB | Free forum support | Báo cáo lạm dụng | Thảo luận mới nhất