2013-04-05 58 views
11

Tôi muốn tạo sự phù hợp với logharitmic. Nhưng tôi vẫn gặp phải lỗi thời gian chạy:Scipy curvefit RuntimeError: Không tìm thấy thông số tối ưu: Số lượng cuộc gọi đến chức năng đã đạt đến maxfev = 1000

Optimal parameters not found: Number of calls to function has reached maxfev = 1000

Tôi sử dụng tập lệnh sau. Bất cứ ai có thể cho tôi biết nơi tôi đi sai? Tôi sử dụng Spyder là một người mới bắt đầu.

import math 
import matplotlib as mpl 
from scipy.optimize import curve_fit 
import numpy as np 

#data 
F1=[735.0,696.0,690.0,683.0,680.0,678.0,679.0,675.0,671.0,669.0,668.0,664.0,664.0] 
t1=[1,90000.0,178200.0,421200.0,505800.0,592200.0,768600.0,1036800.0,1371600.0,1630800.0,1715400.0,2345400.0,2409012.0] 

F1n=np.array(F1) 
t1n=np.array(t1) 

plt.plot(t1,F1,'ro',label="original data") 

# curvefit 
def func(t,a,b): 
    return a+b*np.log(t) 

t=np.linspace(0,3600*24*28,13) 

popt, pcov = curve_fit(func, t, F1n, maxfev=1000)  

plt.plot(t, func(t, *popt), label="Fitted Curve") 

plt.legend(loc='upper left') 
plt.show() 

Trả lời

2

Sau khi sửa chữa báo cáo nhập khẩu của bạn:

#import matplotlib as mpl 
import matplotlib.pyplot as plt 

mã của bạn sản xuất được lỗi sau:

RuntimeWarning: divide by zero encountered in log 

thay đổi:

#t=np.linspace(0,3600*24*28,13) 
t=np.linspace(1,3600*24*28,13) 

sản xuất đầu ra sau đây:

enter image description here

8

dữ liệu ban đầu của bạn là t1F1. Do đó, curve_fit phải được cung cấp t1 làm đối số thứ hai, không phảit.

popt, pcov = curve_fit(func, t1, F1, maxfev=1000) 

Bây giờ khi bạn có được các thông số được trang bị, popt, bạn có thể đánh giá func tại các điểm trong t để có được một đường cong được trang bị:

t = np.linspace(1, 3600 * 24 * 28, 13) 
plt.plot(t, func(t, *popt), label="Fitted Curve") 

(Tôi đã gỡ bỏ không từ t (mỗi câu trả lời StuGrey của) để tránh Warning: divide by zero encountered in log.)


import matplotlib.pyplot as plt 
import scipy.optimize as optimize 
import numpy as np 

# data 
F1 = np.array([ 
    735.0, 696.0, 690.0, 683.0, 680.0, 678.0, 679.0, 675.0, 671.0, 669.0, 668.0, 
    664.0, 664.0]) 
t1 = np.array([ 
    1, 90000.0, 178200.0, 421200.0, 505800.0, 592200.0, 768600.0, 1036800.0, 
    1371600.0, 1630800.0, 1715400.0, 2345400.0, 2409012.0]) 

plt.plot(t1, F1, 'ro', label="original data") 

# curvefit 

def func(t, a, b): 
    return a + b * np.log(t) 

popt, pcov = optimize.curve_fit(func, t1, F1, maxfev=1000) 
t = np.linspace(1, 3600 * 24 * 28, 13) 
plt.plot(t, func(t, *popt), label="Fitted Curve") 
plt.legend(loc='upper left') 
plt.show() 

enter image description here