Hàm số là gì nhỉ? Nếu theo đúng định nghĩa của nó thì có lẽ ko thể xây dựng được một lớp cụ thể cho nó vì nó chứa quá nhiều thứ, cả căn, logarit, lũy thừa, mũ... Có lẽ bạn muốn xây dựng lớp cho lớp hàm số là các đa thức bậc bất kỳ? Điều này có thể thực hiện được với một số chú ý sau:
"Không thể tìm được nghiệm chính xác ( bằng công thức ) của một đa thức bất kỳ có bậc >=5"
+ Thực tế trong máy tính, một số nguyên/thực luôn được lưu là một dãy các bit 0/1. Như vậy hầu như luôn tồn tại sai số trong cách biểu diễn này với số thực, dù rằng sai số này có thể rất nhỏ.
+ Phương trình bậc lẻ luôn có nghiệm ( như Xcross87 đã nói ).
+ Thực tế phương trình bậc n luôn có n nghiệm ( nếu ta xét cả nghiệm phức )
+ Với phương trình bậc chẵn, với chú ý trên, ta chỉ có thể tìm nghiệm gần đúng của nó ( với sai số chấp nhận được cho trước ).
+ Máy tính giúp chúng ta rất nhiều trong việc tìm nghiệm gần đúng. Cơ sở cho việc tìm nghiêm gần đúng là các định lý về phương pháp tính ( bạn có thể đọc thêm sách về Phương pháp tính để hiểu rõ hơn ).
+ Nếu bạn ko muốn mua sách
có một phương pháp rất đơn giản, dễ hiểu để tìm nghiệm gần đúng: phương pháp chia đôi. Kiến thức sau là trợ giúp toán học cho phương pháp
- Khoảng cách ly nghiệm[kcln]: (a,b) là khoảng cách ly nghiệm của phương trình f(x) = 0 khi tồn tại duy nhất nghiệm của phương trình trong khoảng đó.
- Có thể chứng minh rằng nếu f(a).f(b) < 0 và trong khoảng (a,b) chỉ có một nghiêm => (a,b) là kcln.
- Nếu (a,b) là kcln, ta đi tính c = (a+b)/2 và tính f(c) khi đó ta sẽ được kcln mới (a,c) ( nếu f(b) và f(c) cùng dấu ) hoặc kcln (c, b) ( nếu f(a) và f(c) cùng dấu ).
Lặp lại cách tính trên, ta cứ chia đôi kcln mới tìm được thì cuối cùng ta được kcln đủ nhỏ so với epsilon và ta chọn một đầu là nghiệm.
Minh họa
Code:
float c = ( a + b ) / 2;
ep = a - b ; // độ bé của khoảng
while( ep > epsilon ) {
if( f(c) == 0 ) ...
else
if( f(c)*f(a) > 0 )
a = c;
else
b = c;
}
Việc còn lại của bạn là tìm các khoảng cách ly nghiệm cho phương trình
Thân!