Расчет наклона через дискретные точки в Python - PullRequest
0 голосов
/ 29 апреля 2018

Я построил четыре отдельных точки с помощью matplotlib и хотел бы найти наклон наиболее подходящей линии через них. Как вариант, я бы хотел построить эти точки одной линией и, если возможно, найти наклон. Я также пытаюсь сделать это в логарифмическом масштабе. Вот что у меня есть (расчеты за период были получены в другом месте моего кода):

import matplotlib.pyplot as plt
# First orbit
x_0 = 10.0
a1 = x_0
T1 = len(range(1, 98))

# Second orbit
x_0 = 5.0
a2 = x_0
T2 = len(range(1, 63))

# Third orbit
x_0 = 7.0
a3 = x_0
T3 = len(range(1, 81))

# Fourth orbit
x_0 = 13.0
a4 = x_0
T4 = len(range(1, 138))

smaxis = [a1, a2, a3, a4]
T = [T1, T2, T3, T4]

# Plot period versus semi-major axis
for i in range(len(T)):
    plt.plot(T[i], smaxis[i], markersize=3, marker='o')
plt.xlabel('Period (T)')
plt.ylabel('Semimajor Axis (a)')
plt.xscale('log')
plt.yscale('log')
plt.title('Logarithmic scale of T vs a')

И мой график показан здесь.

Я пытался использовать linregress с этим кодом:

from scipy.stats import linregress
linregress(T, smaxis)

Но я не уверен, что это правильно, поскольку T и smaxis являются списками, и мне нужен наклон между линией наилучшего соответствия через показанные дискретные точки. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вот как вы ловите и используете вывод linregress.

from scipy.stats import linregress

slope, intercept, r_value, p_value, std_err = linregress(T, smaxis)

def a_predict(T):
    return intercept + slope*T

T_min, T_max = min(T), max(T)
a_min, a_max = a_predict(T_min), a_predict(T_max)

plt.plot([T_min, T_max], [a_min, a_max], 'r--')

print(slope, intercept, r_value, p_value, std_err)

Выход:

0.10753736192332683 -1.3585120207927215 0.9841584242334624 0.015841575766537552 0.013698301731763748

plot image

(я получил это из документации ).

Но вам может быть удобнее сначала преобразовать свои списки в массивы.

import numpy as np
x = np.array(T)

Затем вы можете выполнять векторизованные вычисления, как в примере из документации:

plt.plot(x, intercept + slope*x, 'r--')
0 голосов
/ 29 апреля 2018

Рассмотрим код ниже, который использует numpy's polyfit .

x=T
y=smaxis
fit = np.polyfit(x, y, 1)
fit_fn = np.poly1d(fit)
s,i = fit
print("slope: ",s," intercept: ",i)
for i in range(len(T)):
    plt.plot(T[i], smaxis[i], markersize=3, marker='o')
plt.xlabel('Period (T)')
plt.ylabel('Semimajor Axis (a)')
plt.xscale('log')
plt.yscale('log')
plt.title('Logarithmic scale of T vs a')
plt.plot(x, fit_fn(x))
plt.show()

Выход:

enter image description here

...