2016-07-13 8 views
1

У меня проблема с аппроксимацией полиномиального соответствия. Более подробный обзор моей проблемы показан HERE. В основном я хочу сгладить среднюю часть полинома, которую я получил в результате длительных математических манипуляций и показан ниже. enter image description here Идея, которую я получил, состоит в том, чтобы взять диапазон от начала и диапазона от конца многочлена (его точки) и сделать приближенный многочлен, который не имеет размахивания в средней части; выбранные точки показаны ниже. enter image description here Однако, используя функцию polyfit, я не смог получить многочлен, на который я надеялся. enter image description hereАппроксимация полинома соответствует заданным данным

Это основная часть моего кода:

from sympy import* 
import numpy as np 
init_printing() 
%matplotlib inline 
import matplotlib.pyplot as plt 

S = np.linspace(25, 400, 1000) 
SS = np.log10(S) 
def f(logS): # the polynomial that I got 
    return 10**(-57.2476193068601*logS**5 + 585.900632193053*logS**4 - 2384.35277925916*logS**3 + 4821.25582425353*logS**2 - 4845.47249368281*logS + 1943.75303313331) 

xdata = f(SS) 
ydata = S 

plt.figure(figsize=(12, 10), dpi= 600, facecolor='w', edgecolor='k') 

plt.loglog(xdata, ydata,'k-') 
# Data for new polynomial (approximation) 
XX = xdata[:40].tolist() 
X1 = xdata[len(xdata)-350:].tolist() 
YY = ydata[:40].tolist() 
Y1 = ydata[len(ydata)-350:].tolist() 
for i in range(len(X1)): 
    XX.append(X1[i]) 
    YY.append(Y1[i]) 

# Approximation polynomial fit 
plt.loglog(XX,YY,'mo') 
x_t = np.linspace(np.min(xdata), np.max(xdata),1000) 
p = np.poly1d(np.polyfit(XX,YY, deg=5)) 

plt.loglog(x_t, p(x_t),'g-') 
print(p) 

plt.ylim((np.min(ydata), np.max(ydata))) 
plt.xlim((np.min(xdata), np.max(xdata)*0.7)) 

plt.xlabel('xdata') 
plt.ylabel('ydata') 
plt.grid(True, which="both") 

Я хотел бы несколько советов о том, как исправить это приближение полиномиальное проблему или, если есть другой способ решить машет в середине раздела - это лучший способ сглаживания. Любая помощь очень ценится!

+0

Вы пытались увеличить порядок вашего полинома? – gabra

+0

Я хотел бы использовать тот же самый степенной аппроксимационный полином, что и мой исходный многочлен. Это идея сглаживания средней части и сравнение их коэффициентов в конце ... – mcluka

+0

Будет сложно найти один многочлен, чтобы охватить ваше пространство и воспроизвести эти данные. Это легко с кусочными многочленами. Я бы попробовал это. – duffymo

ответ

4

Вы пытаетесь установить полином на регулярные данные, который находится в шкале exp-exp, и только запишите его в log-log, где он выглядит как многочлен. Вы не сможете представить такое отношение с полиномом. Предварительно обрабатывайте все, чтобы быть в лог-масштабе, в первую очередь, подбирайте полином там, и если вы хотите вернуться в свой мир exp-exp, снова выполните пост-процесс.

from sympy import* 
import numpy as np 
import matplotlib.pyplot as plt 

S = np.linspace(25, 400, 1000) 
SS = np.log10(S) 
def f(logS): # the polynomial that I got 
    return 10**(-57.2476193068601*logS**5 + 585.900632193053*logS**4 - 2384.35277925916*logS**3 + 4821.25582425353*logS**2 - 4845.47249368281*logS + 1943.75303313331) 



xdata = np.log(f(SS)) 
ydata = np.log(S) 

plt.figure(figsize=(12, 10),facecolor='w', edgecolor='k') 
plt.plot(xdata, ydata, 'k-') 
#plt.loglog(xdata, ydata,'k-') 
# Data for new polynomial (approximation) 
XX = xdata[:40].tolist() 
X1 = xdata[len(xdata)-350:].tolist() 
YY = ydata[:40].tolist() 
Y1 = ydata[len(ydata)-350:].tolist() 
for i in range(len(X1)): 
    XX.append(X1[i]) 
    YY.append(Y1[i]) 


# Approximation polynomial fit 
#plt.loglog(XX,YY,'mo') 
x_t = np.linspace(np.min(xdata), np.max(xdata),1000) 
p = np.poly1d(np.polyfit(XX,YY, deg=5)) 

#plt.loglog(x_t, p(x_t),'g-') 
plt.plot(x_t, p(x_t),'g-') 
print(p) 

plt.ylim((np.min(ydata), np.max(ydata))) 
plt.xlim((np.min(xdata), np.max(xdata))) 

plt.xlabel('xdata') 
plt.ylabel('ydata') 
plt.grid(True, which="both") 
plt.show() 

enter image description here

+0

Есть ли лучший способ сглаживания полинома и решить эту волнующую проблему вообще? – mcluka

+0

зависит от точной настройки, существующих ограничений, какова истинная, основная цель и почему. Установка, которую вы предложили, основана на MSE, что может оказаться не оптимальным. Существует много возможных критериев гладкости, которые можно использовать (особенно если вы можете оставить пространство полиномов). Одним из типичных решений будет некоторая сплайн вместо этого, чтобы просто «приклеить» часть кривой, которую вы хотите посмотреть по-другому. Но, как я уже сказал, в целом проблема сейчас не определена, и требует много предположений, чтобы мы могли «решить», а не «подходить» :-) – lejlot

+0

Я занимаюсь своим магистром по этой теме и с помощью математической процедуры и Экспериментальные данные Я получил экстраполированные полиномы, которые лучше всего подходят для всех экспериментальных точек. Однако, как вы можете видеть [ЗДЕСЬ] (http://i.stack.imgur.com/FHDo5.png), полиномы более высокого класса (n = 4, n = 5) имеют эту волнующую проблему, и я хотел бы получить непрерывных многочленов без каких-либо флуктуаций. Я не знаю, как исправить оригинальные экстраполированные полиномы, поэтому я пришел к этой идее здесь ... но я был бы рад, если бы вы предложили мне любую литературу или другие источники, которые могли бы быть полезны в этом вопросе. Благодаря! – mcluka

 Смежные вопросы

  • Нет связанных вопросов^_^