2012-06-17 28 views
9

Một người bạn của tôi phát hiện ra một số hành vi kỳ quặc trong gnuplot liên quan đến một sự đa thức đơn giản Có thể sombody giải thích điều này?Gnuplot hoạt động kỳ quặc trong sự đa thức phù hợp. Tại sao vậy?

Dưới đây là file:

#!/usr/bin/gnuplot -p 

f(x) = B*(x**4) + A 
fit f(x) "data.txt" using ($1+273.14):2 via A, B 

plot "data.txt" using ($1+273.14):2 notitle,\ 
     f(x) notitle 

Dữ liệu là:

# content of data.txt 
350 3.856 
330 3.242 
290 2.391 
250 1.713 
210 1.181 
170 0.763 
130 0.437 

Cốt truyện kết quả là dòng màu xanh lá cây. Đường màu xanh cho thấy sự phù hợp tốt hơn nhiều bằng cách sử dụng một hàm khác về cơ bản cùng một dạng. Đối với dòng màu xanh lá cây A được thay thế bằng một giá trị không đổi (A = 0,2123 đó là khoảng B * 300^4)

odd fitting behavior gnuplot

Vì vậy, các đường màu xanh rõ ràng là không phù hợp nhất ở đây từ f(x) = B*(x**4) - 0.2123 mang betterresults xa và cũng có dạng B * x 4 + A. Màu xanh lá cây phù hợp với tham số ** A chỉ đơn giản là bị bỏ qua bởi gnuplot và vẫn không thay đổi bằng thuật toán phù hợp. Thiết lập các giá trị ban đầu khác nhau cho A và B dường như không giúp được gì nhiều - giá trị của A không bao giờ thay đổi cho giá trị inital của nó. Bạn tôi và tôi đang sử dụng phiên bản Gnuplot chuẩn đi kèm với Ubuntu: gnuplot 4.4 patchlevel 3.

Trả lời

7

Đây là câu hỏi rất hay và tôi không có câu trả lời hoàn chỉnh, nhưng sau đây hy vọng được chiếu sáng.

Fit sử dụng thói quen phù hợp với hình vuông nhỏ nhất (Levenberg–Marquardt). mà lặp đi lặp lại hội tụ trên một giải pháp "tốt". Giải pháp được yêu cầu tốt như thế nào được xác định bởi biến số FIT_LIMIT. Theo mặc định, FIT_LIMIT được đặt thành (bảo thủ) 1.e-5. Rõ ràng, dữ liệu của bạn hội tụ nhanh hơn nhiều bằng cách thay đổi giá trị của B trong định tuyến lặp lại so với thay đổi A. Thực tế, như bạn đã nhận thấy, bạn có thể nhận được dưới ngưỡng lỗi mà không cần chạm vào biến A. Tuy nhiên, nếu bạn quay lên mong đợi của bạn (Bạn mong đợi để có được sự phù hợp hơn, vì vậy bạn đặt FIT_LIMIT thành giá trị thấp hơn - tôi đặt nó thành 1.e-14), bạn sẽ nhận được kết quả tốt hơn nhiều. Giá bạn trả ở đây là sự phù hợp có thể mất nhiều thời gian hơn để hội tụ (hoặc nó thậm chí có thể phân kỳ - Tôi không phải là một chuyên gia phù hợp). Một điều thú vị ở đây là chức năng phù hợp là một nghệ thuật nhiều hơn khoa học - và có không có thứ gì phù hợp nhất, chỉ có đủ tốt phù hợp với.

Cũng lưu ý rằng thuật toán tìm kiếm giảm thiểu cục bộ của các ô vuông của số dư (đáp ứng dung sai bạn đã cung cấp). Nó không đảm bảo rằng nó tìm thấy một tối thiểu toàn cầu.

#!/usr/bin/gnuplot -p 

FIT_LIMIT=1.e-14 
f(x) =A + B*(x**4) 
fit f(x) "data.txt" using ($1+273.14):2 via A, B 

plot  "data.txt" using ($1+273.14):2 notitle,\ 
     f(x) notitle 

Cũng lưu ý rằng nếu bạn tìm thấy gnuplot được hội tụ trên mức tối thiểu sai, bạn có thể "hạt giống" thói quen phù hợp bằng cách thực hiện:

FIT_LIMIT=1.e-14 
f(x) =A + B*(x**4) 
A=1.3 #initial guess for A 
fit f(x) "data.txt" using ($1+273.14):2 via A, B 

plot  "data.txt" using ($1+273.14):2 notitle,\ 
     f(x) notitle 
+0

Tanks rất nhiều. Là một nhà vật lý, tôi khá quen thuộc với việc lắp ghép nói chung. Tôi đã không nghĩ rằng gnuplot là xấu. Có một lý thuyết toán học khép kín cho phù hợp đa thức và hội tụ của chúng sẽ mang lại kết quả lý tưởng.Gnuplot shouln't có rắc rối với một đa thức đơn giản nhưng tôi hiểu rằng ít nhất vuông phù hợp với một giới hạn yếu về lỗi nên là nguyên nhân của vấn đề của tôi. Cảm ơn một lần nữa. –

+0

@ con-f-sử dụng Yeah, bạn có thể làm tốt hơn với đa thức phù hợp, nhưng thói quen phù hợp trong gnuplot có nghĩa là để xử lý bất cứ điều gì, vì vậy tôi đoán (để đơn giản) họ không cố gắng tìm ra nếu bạn đang phù hợp một đa thức thay vì một số hàm phi tuyến tính. – mgilson

+0

Có, chỉ cần nói rằng có lẽ họ nên ;-) –

5

Chỉ cần cố gắng vào mã bên dưới. Bí quyết là để đảm bảo rằng phạm vi của các biến x và y có cùng thứ tự độ lớn.

reset; 
plot 'data.txt' u ($1+273.14):2 w p; 
f(x, a, b) = a*(1e-2*x)**4 + b; # note the 1e-2 multiplicative factor 
a = 1; b = 1; # initial parmeters 
fit f(x,a,b) 'data.txt' u (($1+273.14)):2 via a, b 
#plot 'data.txt' u (($1+273.14)):2 w p, f(x, a, b) w l 
plot 'data.txt' u (($1+273.14)):2 w p, (a*(1e-2)**4)*x**4+b w l 
print sprintf("Fit parameters for the fit function a*x^4 + b are :\n\ta = %e, \n\tb = %f", a*(1e-2)**4, b) 

Image of the graph

+1

phiên bản gnuplot> 5.0 có một tùy chọn "thiết lập cân bằng phù hợp" tự động điều chỉnh giá trị bắt đầu. Bạn cần đảm bảo rằng họ đã ở đúng khu vực, tất nhiên rồi. – Karl

Các vấn đề liên quan