У меня есть два уравнения, которые исходят из одного единственного матричного уравнения:
[x,y] = [[cos(n), -sin(n)],[sin(n), cos(n)]]*[x', y']
,
где x' = Acos(w1*t+ p1)
и y' = Bcos(w2*t + p2)
.
Это всего лишь одно матричное уравнение для вектора [x,y]
, но его можно разложить на 2 скалярных уравнения: x = A*cos(s)*cos(w1*t+ p1)*x' - B*sin(s)*sin(w2*t + p2)*y'
и y = A*sin(s)*cos(w1*t+ p1)*x' + B*cos(s)*sin(w2*t + p2)*y'
.
Поэтому я устанавливаю два набора данных: x
против t
и y
vs. t
, но в этих наборах есть некоторые общие параметры, а именно A
, B
и s
.
1) Могу ли я непосредственно подставить матричное уравнение или мне нужно разложить его на скалярные? Первый был бы более изящным.
2) Могу ли я поместиться с общими параметрами на curve_fit
? Все соответствующие вопросы используют другие пакеты.
Нижеприведенный пример кода подходит для двух разных уравнений с одним общим параметром с использованием curve_fit. Это не ответ на ваш вопрос, но я не могу форматировать код в комментарии, поэтому я размещаю его здесь.
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
y1 = np.array([ 16.00, 18.42, 20.84, 23.26, 25.68])
y2 = np.array([-20.00, -25.50, -31.00, -36.50, -42.00])
comboY = np.append(y1, y2)
h = np.array([5.0, 6.1, 7.2, 8.3, 9.4])
comboX = np.append(h, h)
def mod1(data, a, b, c): # not all parameters are used here
return a * data + c
def mod2(data, a, b, c): # not all parameters are used here
return b * data + c
def comboFunc(comboData, a, b, c):
# single data set passed in, extract separate data
extract1 = comboData[:len(y1)] # first data
extract2 = comboData[len(y2):] # second data
result1 = mod1(extract1, a, b, c)
result2 = mod2(extract2, a, b, c)
return np.append(result1, result2)
# some initial parameter values
initialParameters = np.array([1.0, 1.0, 1.0])
# curve fit the combined data to the combined function
fittedParameters, pcov = curve_fit(comboFunc, comboX, comboY, initialParameters)
# values for display of fitted function
a, b, c = fittedParameters
y_fit_1 = mod1(h, a, b, c) # first data set, first equation
y_fit_2 = mod2(h, a, b, c) # second data set, second equation
plt.plot(comboX, comboY, 'D') # plot the raw data
plt.plot(h, y_fit_1) # plot the equation using the fitted parameters
plt.plot(h, y_fit_2) # plot the equation using the fitted parameters
plt.show()
print(fittedParameters)