Tính căn bậc 3 với độ chinh xác 0.001 bằng phương pháp chia đôi

Bác nào định hướng cho e bài này với! Em xin cảm ơn.
VCT tính căn bậc ba của một số thực chính xác đến 0.001 – áp dụng thuật toán nhị phân, không dùng đến các hàm tính toán

giải pt x3 - n = 0 là ra

đặt f(x) = x3 - n
nếu n < 1 thì chọn xL = 0 và xR = 1 để f(xL) < 0 và f(xR) > 0
nếu n = 1 thì đáp số là 1
nếu n > 1 thì chọn xL = 0 và xR = n để f(xL) < 0 và f(xR) > 0

rồi tìm nhị phân xM = (xL + xR)/2 tới khi nào f(xM) = 0 hoặc xR - xL < 0.002 thì trả về xM

4 Likes

Cảm ơn bạn nhiều nhé, để mình thử xem

Hoặc còn có một cách khác.

Ta có:

  • x3 = n
  • x = n / x2
  • x = (x + n / x2) / 2

Vậy ban đầu gán x bằng 1.

Rồi thực hiện gán x bằng (x + n / x2) / 2 cho đến khi |(x + n / x2) / 2 - x| < sai số đã cho. :slight_smile:


Edit: Thiếu xử lý trường hợp x = 0. :stuck_out_tongue:


Test thử thấy cũng lẹ ghê, không quá 35 loops. :slight_smile:
https://rextester.com/VEUVL64094


Thay return count thành return x nếu thớt muốn lấy result. :blush:

4 Likes

Bạn ơi, mình đã tính được rồi nhưng mà không tính đến 0. 001 được

double Func(double x, double n){
	return pow(x, 3) - n;
}

double canBac3(double n) {
	const double epsilon = 0.001;
	if (n == 1 || n == -1) return n;
			double right;
			double left;
			double mid;
			if (n < 1) {
				right = 1;
				left = 0;
				while (right - left > epsilon) {
					mid = (left + right) / 2;
					if (Func(left, n) * Func(mid, n) < 0)
						right = mid;
					else 
						left = mid;			
				};
			return mid;
			}
			else {
				right = n;
				left = 1;
				while (right - left > epsilon) {
					mid = (left + right) / 2;
					if (Func(left, n) * Func(mid, n) < 0)
						right = mid;
					else 
						left = mid;			
				};
				return mid;
			};	
}

cái này là sao đây?? :V

2 Likes

để tính xem nghiệm nó có nằm trong khoảng (left, mid) không á bạn, nếu không phải thì nó nằm trong (mid,right)


Giống như này nè bạn

sách bậy bạ :V :V Kiểm tra Func(mid) > 0 hay ko là được rồi tự dưng nhân vào làm gì @_@

sách viết rác rưởi sao solve ko trả về double mà trả về void, đi truyền x vào để chỉnh sửa x @_@

4 Likes

bớt đùa bác ơi, sách nhập môn lập trình của Đại học KHTN á :v

sách viết rác rưởi thì mình nói rác rưởi ko có đùa đâu :V

int main return 1 ???

sorry em đốt sách đó đi, đòi lại tiền

4 Likes


Show cho bác xem, sách tui đang học luôn á

Đem lên hỏi ông thầy

  • vì sao Solve trả về void mà ko trả về double
  • vì sao hàm main lại trả về 1
  • vì sao kiểm tra f(mid) âm hay dương lại phải nhân với f(left).

ko trả lời được thì lên hiệu trưởng xin đòi lại tiền học

4 Likes

hàm void truyền tham chiếu mà bác
khi f(mid) * f(left) < 0 thì nghiêm chắc chắn sẽ nằm trong đó, tiếp tục gán right = mid.
ngược lại thì nghiêm nằm trong (mid, right), gán mid = left
Còn việc return 1 hay 0 thì chương trình nó đều ra như nhau mà, có sai gì đâu, thầy bảo không sao

Vì chương trình có lỗi. :slight_smile:

3 Likes

thầy bảo ko sao thì nghỉ học đi

f(left) đã bé hơn 0 rồi thì nhân vào làm gì??? Sao ko ghi là f(mid) > 0 thay vì f(mid) * f(left) < 0

5 Likes

lỗi chỗ nào vậy bạn ?

Danh sách lỗi anh TT đưa rồi. :slight_smile:

2 Likes

lỗi chỗ trả về 1. main() return 0 mới là chương trình ko có lỗi…

4 Likes

cũng may viết code C ở cái bìa chứ thấy chữ void main mình lại lên cơn rồi =]]]]]]]

1 Like


Tác giả đây.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?