Подгонка функции cos квадрат - PullRequest
0 голосов
/ 17 марта 2020

Я пытался приспособить функцию формы к данным, которые мне дали:

160 0.277   0.006
170 0.2805  0.005
180 0.2825  0.007
190 0.276   0.012
200 0.2475  0.011
210 0.1645  0.009
220 0.1075  0.011
230 0.0785  0.009
240 0.0585  0.005
250 0.048   0.002
260 0.046   0.002
270 0.0485  0.001
280 0.0555  0.001
290 0.078   0.002
300 0.113   0.002
310 0.161   0.01
320 0.262   0.008
330 0.3035  0.005
340 0.326   0.004
350 0.3305  0.007
360 0.336   0.006
10  0.3275  0.005
20  0.3075  0.007
30  0.231   0.012
40  0.1625  0.005
50  0.1205  0.003
60  0.0905  0.003
70  0.0775  0.001
80  0.075   0.002
90  0.077   0.002
100 0.079   0.004
110 0.0965  0.003
120 0.124   0.002
130 0.1695  0.003
140 0.281   0.004
150 0.32    0.002

Это код, который я написал:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy import special as sp

def strt(x, a, b):
    """definition of a straight line"""
    return a*x+b

def trig(x, ang, I0, offset):
    """cos function to be fit"""
    return offset+(I0*(sp.cosdg(x-ang)**2))



"""file handler block"""
f=open(r"C:\Users\lenovo\Desktop\trials.txt", "r")
raw=f.readlines()
data=np.loadtxt(raw)
data=np.transpose(data)
f.close()

"""fitting block"""
popt1, pcov1 = curve_fit(trig, data[0], data[1])
print(popt1)
#print(pcov1)
perr1 = np.sqrt(np.diag(pcov1))
print(perr1)

xerror=[1]*len(data[0])

"""plotting block"""
plt.figure('a')

plt.scatter(data[0], (data[1]), c='b', label="Data")
plt.plot(data[0], trig(data[0], *popt1), 'b-', label='fit: a=%5.3f, b=%5.3f c=%5.3f; sigma a=%5.3e, sigma b=%5.3e, sigma c=%5.3e' %tuple(list(popt1)+list(perr1)))
#plt.plot(data[0], trig(data[0], *popt1), 'b-', label='fit: a=%5.3f; sigma a=%5.3e' %tuple(list(popt1)+list(perr1)))
plt.xlabel('Angle (degrees)', fontsize=20)
plt.errorbar(data[0], data[1], fmt='none', xerr=xerror, yerr=data[2], ecolor='b', markersize=8, capsize=5)
#plt.xlim([-0.0075, 0.0075])
#plt.ylim([-3, 50])
plt.ylabel('Power ($\mu$W)', fontsize=20)
plt.legend(prop={"size":15}, loc='upper left')
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.grid(True, which='both')
plt.axhline(y=0, color='k')
plt.show('a')

Подгонка выглядит отлично но по какой-то причине изображение имеет прямую линию, идущую от конца до конца кривой. Что, я думаю, означает, что функция дает два выхода для каждого входа. Я хочу знать, почему это происходит и как я могу это исправить. Я попытался установить только функцию cos, и на выходном изображении все равно будет прямая линия, идущая от конца к концу. Может ли кто-нибудь помочь, пожалуйста? выходное изображение

1 Ответ

0 голосов
/ 20 марта 2020

Мне удалось решить эту проблему: данные должны быть перечислены в порядке возрастания, а приведенный выше список начинается с середины.

...