В настоящее время я работаю над лабораторным отчетом для Броуновского движения, используя это уравнение PDF с целью оценки D: уравнение Броуновского PDF
И я пытаюсь подогнать его под гистограмму. Однако всякий раз, когда я рисую свой curve_fits, это линия, которая неправильно отображается на гистограмме. Пример гистограммы с плохой кривой curve_fit
А вот мой код:
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
# Variables
eta = 1e-3
ra = 0.95e-6
T = 296.5
t = 0.5
# Random data
r = np.array(np.random.rayleigh(0.5e-6, 500))
# Histogram
plt.hist(r, bins=10, density=True, label='Counts')
# Curve fit
x,y = np.histogram(r, bins=10, density=True)
x = x[2:]
y = y[2:]
bin_width = y[1] - y[2]
print(bin_width)
bin_centers = (y[1:] + y[:-1])/2
err = x*0 + 0.03
def f(r, a):
return (((1e-6)3*np.pi*r*eta*ra)/(a*T*t))*np.exp(((-3*(1e-6 * r)**2)*eta*ra*np.pi)/(a*T*t))
print(x) # these are flipped for some reason
print(y)
plt.plot(bin_centers, x, label='Fitting this', color='red')
popt, pcov = optimize.curve_fit(f, bin_centers, x, p0 = (1.38e-23), sigma=err, maxfev=1000)
plt.plot(y, f(y, popt), label='PDF', color='orange')
print(popt)
plt.title('Distance vs Counts')
plt.ylabel('Counts')
plt.xlabel('Distance in micrometers')
plt.legend()
Проблема с моей кривой_fit? Или я упустил какую-то основную проблему?
РЕДАКТИРОВАТЬ: Я разбил D, чтобы получить константу Больцмана, как a
в функции, поэтому в ней больше чисел, f
чем в уравнении выше. D и Гамма.
Я попытался возиться с начальными условиями и построить функцию 1.38e-23
вместо popt
, но это делает это (фиолетовая линия). Это говорит мне, что что-то не так с уравнением для f
, но я не вижу никаких проблем, когда смотрю на него. Я что-то упускаю?
РЕДАКТИРОВАТЬ 2: Я изменил функцию на это, чтобы упростить ее и соответствовать numpy.random.rayleigh()
распределению:
def f(r, a):
return ((r)/(a))*np.exp((-1*(r)**2)/(2*a))
Но это не решает проблему, заключающуюся в том, что curve_fit
это линия с положительным наклоном, а не что-то отдаленно то, что меня интересует. Теперь я больше не понимаю, в чем проблема.
Здесь есть несколько вещей. Я не думаю, что x и y когда-либо менялись местами, или, по крайней мере, когда я предполагал, что это не так, все, казалось, работало нормально. Я также очистил несколько частей кода, например, я не уверен, почему вы вызываете две разные гистограммы; и я думаю, что могли быть проблемы с обработкой одноэлементного кортежа параметров. Кроме того, для подбора кривой первоначальное предположение параметра часто должно быть приблизительным, поэтому я тоже изменил его.
Вот версия, которая мне подходит:
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
# Random data
r = np.array(np.random.rayleigh(0.5e-6, 500))
# Histogram
hist_values, bin_edges, patches = plt.hist(r, bins=10, density=True, label='Counts')
bin_centers = (bin_edges[1:] + bin_edges[:-1])/2
x = bin_centers[2:] # not necessary, and I'm not sure why the OP did this, but I'm doing this here because OP does
y = hist_values[2:]
def f(r, a):
return (r/(a*a))*np.exp((-1*(r**2))/(2*a*a))
plt.plot(x, y, label='Fitting this', color='red')
err = x*0 + 0.03
popt, pcov = optimize.curve_fit(f, x, y, p0 = (1.38e-6,), sigma=err, maxfev=1000)
plt.plot(x, f(x, *popt), label='PDF', color='orange')
plt.title('Distance vs Counts')
plt.ylabel('Counts')
plt.xlabel('Distance in Meters') # Motion seems to be in micron range, but calculation and plot has been done in meters
plt.legend()
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения