|
|
cập nhật lúc 04:38 ngày 19/05
|
|
|
|
|
|
| Các bạn xem code này có vấn đề gì không? |
 |
thienduong
Bài viết: 963
|
| Ngày gởi: 15/06/2011 | Số lần xem: 1190 | Góp ý: 2 |
|
|
|
Mình đọc bài của anh minhhanb tại link: http://www.pcgu...i-nay và mình đã thử giải tại code mẩu. Nhưng có một điều thế này, mình test ở những số lớn hơn >=1 thì kết quả cho gần sát với kết quả muốn đạt, nhưng khi test ở dãy số từ 0<x<1 thì kết quả thấy lệch đi khá nhiều. Phải chăng code có vấn đề, mình cũng thử không giới hạn sai số thì kết quả lại gần chính xác. Vậy là sao? mong các bạn giúp mình test lại! |
Code Mẫu:
#include "stdio.h"
#include "conio.h"
#include "math.h"
int get_n(float x)
{
int n=1;
while(fabs(pow(x-1,n)/n)>=0.01)
{
n++;
}
return n-1;
}
int main(void)
{
clrscr();
float ln=0.0,x;
printf(" WELCOME TO PCGUIDE.VN\n________________________________\n");
do
{
printf("nhap vao gia tri x (0<x<2) can tinh ln(x): ");
scanf("%f",&x);
}while(x<=0.0||x>=2.0);
printf("\ngia tri n= %d",get_n(x));
for(int i=1;i<=get_n(x);i++)//muon tang do chinh xac can tang get_n(x)
{
ln+=i%2==0?(-(pow(x-1,i)/i)):(pow(x-1,i)/i);
printf("\n so hang thu %d: %f",i,pow(x-1,i)/i);
}
printf("\n\nVoi sai so la 0.01\nva bang cach tinh bo di cac so hang co \ntri tuyet doi nho hon sai so \nthi ln(%f)= %4.2f",x,ln) ;
getch();
return 0;
}
|
|
|
|
7 |
 Bạn vui lòng chờ trong giây lát
Bài viết đã bị đóng.
|
|
|
| Câu Trả lời |
|
Mình cũng có góp ý để giải bài này như sau
(riêng phần tính sai số bạn có thể tự code)
Code Mẫu:
#include <iostream>
#include <math.h>
using namespace std;
float ln(float , int );
void main()
{
cout << ln(0.5, 100);
}
float ln(float x, int n)
{
if (n==1)
return x - 1;
return ln(x, n-1) + pow(-1.0, n-1)*pow(x-1, n)/n;
}
|
|
|
|
| Bài phản hồi |
Hi. Bạn dùng code này là để tính ln(x). Bài này yêu cầu giải phải tính đến có sai số là 0.01 nên cách này không phù hợp với đề bài. Bạn xem đề bài mình gửi trong bài mình gửi. Rất cảm ơn bạn đã góp ý. Chúc bạn thành công!!!
Thì mình cũng có nói là phần sai số bạn tự tính đó! get_n như bạn rồi quăng vào trong hàm ln(x, get_n(x)) là xong, tại mình k muốn code lại cái bạn đã code.
Mục đích hàm get_n(x) của mình là không muốn phải laqpj một cách lãng phí các giá trị khi mà số hạng đã nhỏ hơn 0.01 thôi.
Vậy bạn có học cái phần khai triển Taylor trong môn Giải tích k? Trong đó có phần tính sai số khi khai triển ra đó, cuối cùng là gì? Là tìm ra cái số mũ chứ là gì nữa nhỉ?
|
|
| Câu Trả lời |
|
Bạn xem lại chỗ này
Code Mẫu:
....
printf("\n so hang thu %d: %f",i,pow(x-1,i)/i);
...
|
|
|
|
| Bài phản hồi |
Cái này mình chỉ hiển thị ra màn hình để kiểm tra các số hạng trong tổng mà. Mình kiểm tra không có vấn đề gì
Ủa vậy sai là sai ở chỗ nào nhỉ? Mình thấy kết quả cũng đúng mà! Tại mình nghĩ bạn lấy mấy số hiển thị trên màn hình cộng lại rồi đem so với kết quả bên dưới thì thấy sai đi chứ! Nhưng đó cũng là 1 chỗ sai rồi! :D
Đó là do cái này nè bạn %4.2f với ln(x) và %f với các số hạng %4.2f với ln(x) vì đề bài có cho sai số nên không cần in tất cả. Mình thắc mắc không hiểu sao test ở dãy số từ 0<x<1 thì kết quả thấy lệch đi khá nhiều.
Mình vẫn chưa hiểu ý bạn?
Mà cái đề nó yêu cầu là bỏ đi những số có abs < 0.01 chứ k phải là bỏ đi phần < 0.01 trong kết quả như của bạn làm
Bạn thử test ở 0.005 thử xem. -4.51 là kết quả chương trình và xấp xỉ -5.30 là kết quả gần đúng
Chẳng có chỗ nào sai cả, làm đúng yêu cầu đề bài. Sai số đề cho k phải là so với kết quả chính xác!
À, cái công thức tổng quát ((-1)^n-1*(x-1)^n)/n cũng là do tính xấp xỉ mà ra đc đó!
Thank bạn nhiều vì đã cùng chia sẻ.
Ừ, nếu bạn cần thì mình sẽ chứng minh cái công thức tổng quát đó cho bạn xem! Do xấp xỉ mà ra!! Thân.
|
|
 |
|
|
Danh sách thành viên bình chọn