Friday, September 30, 2011

[Matlab] Giải phương trình bằng phương pháp chia đôi

Tớ sẽ không code cụ thể ở đây vì không có matlab để test. Chỉ viết lịa nhưng gì hôm nay đã học cho khỏi quên.

1. Symbolic math toolbox:
Symbolic object là đối tượng hình thức (nghĩa là viết bằng chữ - chưa thay số). Ứng dụng của symbolic trong bài này là điểm mấu chốt.
Qua ví dụ này ta cũng hiểu được 1 phần khái niệm functional programming paradism (mô hình lập trình hàm) khi ta dùng 1 hàm làm đối của hàm khác (mặc dù hàm trong trường hợp này mang tính hình thức).


khai báo biến symbolic:
syms x



gán "hàm" : fx giờ cũng là 1 đối tượng symbolic
fx = x*x + 5*x + 6


"thay" giá trị vào x để tính fx:
subs(fx,1)
kết quả trả về 12.

2. Bài tóan giải phương trình bằng phương pháp chia đôi:

Ta sẽ phải viết hàm phuongPhapChiaDoi() gồm các đầu vào:
- sai số
- cận a
- cận b
- hàm f - bởi bài tóan yêu cầu giải phương trình nhưng ko cho phương trình cụ thể. Thế nên bắt buộc hàm phuongPhapChiaDoi phải nhận 1 đối là hàm tóan học - vế trái của phương trình (vế phải mặc định bằng 0). Như vậy, hàm của ta rất "đa năng" - giải được nhiều phương trình khác nhau chứ ko phải 1 kiểu ptr bậc 2, bậc 3 gì đây. Đố ai viết được chương trình  C giải quyết được vấn đề này :D

vậy hàm đầy đủ của ta lúc khai báo là:
function nghiem1 = phuongPhapChiaDoi(f, saiso, cana, canb)
%tạm thời tớ chưa nghĩ ra cách tìm tất cả các nghiệm. Bởi để giải quyết triệt để, ta phải xác định bậc của hàm đầu vào để biết số nghiệm tối đa ở đầu ra. Ví dụ này chỉ tìm 1 nghiệm trong khỏang cho trước.

xong phần vấn đề kỹ thuật, phần còn lại đơn giản vài vòng lặp, if - else khong có vấn đề gì :D

15 comments:

  1. Vớ va vớ vẩn, matlab thì cũng xây dựng từ C, lại bảo C không giải pt đc mới sợ chứ.
    Muốn tìm hết các nghiệm thì phải xác định được tất cả các khoảng phân li rồi tìm nghiệm cho mỗi khoảng, còn xác định thế nào thì chả biết.

    ReplyDelete
  2. không có chữ nào ở đây ghi là không giải được cả!

    ReplyDelete
  3. ai đọc bài này thì đố. ai làm được thì show hàng :))

    Nếu bảo không làm được lại giống bảo C không ltrình HĐT được à. Về nguyên tắc là được, nhưng chỉ những người có khả năng viết code tốt hơn và tối ưu hơn những người đã làm nên C++ mới làm những điều đó (VD to đùng là Linus Torvard). http://stackoverflow.com/questions/351733/can-you-write-object-oriented-code-in-c

    Cụ thể trong trường hợp này là ko nhiều người có thể viết cái thư viện/hàm thực hiện cơ chế đấy bằng C...

    ReplyDelete
  4. This comment has been removed by the author.

    ReplyDelete
  5. cái này là đề tài thực tập của nhóm mình mà :D

    Nói chung là bạn Hưng post lên để mọi người không quên bài thôi , chứ cần chú ý đến một chút đến câu cú trong matlab là làm được thôi mà !

    ReplyDelete
  6. cho tớ bổ sung chút nhá :D
    còn có 2 cách khởi tạo hàm f trong matlap nữa ( hôm trc cô dạy tớ thế )
    1. f = @ (x) x*x +5*x +6
    thay vào tính : fa = feval(f,a)
    2. f = inline (' x*x + 5*x +6)
    thay vào tính: f(a)
    tớ hiểu thế nào viết như vậy, có gì sai mọi người sửa giúp nhé !

    ReplyDelete
  7. sửa chút :
    2. f = inline('x*x +5*x +6')
    < thiếu 1 dấu nháy đơn> :D

    ReplyDelete
  8. các bạn có thể code chi tiết bài này được ko ?
    hoặc có thể gửi file code.m lên đây cũng được. thanks nhìu

    ReplyDelete
  9. okie, mai sẽ có code cho bạn :D

    ReplyDelete
  10. http://pastebin.com/hTce1v3i code chạy trên matlab, cô đã duyệt :))

    ReplyDelete
  11. thấy bài này rất nhiều view nhưng ko thấy comment, bạn nào đọc xong thấy code cần sửa cứ đưa lên, mình sẽ thay đổi cho phù hợp hơn

    ReplyDelete
    Replies
    1. mà xem view ở đâu thế, không để ý :D

      Delete
  12. nó có lên top bên popular post ấy -> lên top = view nhiều

    ReplyDelete