2016-10-12 8 views
0

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

Итак, у меня есть два 2D-массива, f1 (x1) = y1 и f2 (x2) = y2. Я хочу сделать поверхностный график отношения этих, поэтому размер z равен (f2 (x2)/f1 (x1)). К сожалению, я прихожу к стене из любого направления, к которому я подхожу.

Основная проблема заключается в том, что диапазоны каждого массива разные, x1 - от 300 до 50000, а x2 - от 300, 1200. Теперь я доволен предположением, что f2 (x2) = f2 (1200) для все x2> 1200. Но эта привязка означает, что для меня невозможно сопоставить эти данные каким-либо реалистичным образом (мой первый набор данных хорошо воспроизводится полиномом 5-го порядка, а мой второй набор данных лучше всего подходит 1-му многочлен порядка). Есть ли альтернативный способ, которым я могу поместить функцию в (x2, y2), чтобы она принимала граничные значения для всех точек вне границ?

Моя крайне неправильно попытка выглядит так,

# x1 is an array from 300 to 50,000 in steps of 50 
# x2 is an array from 300 to 1,150 in steps of 50 

f1_fit = np.poly1d(np.polyfit(x1, y1, 5)) 
f2_fit = np.poly1d(np.polyfit(x2, y2, 1)) 

X, Y = np.meshgrid(x1, x2) 
Z = (f2_fit(x2)/f1_fit(x1)) 

Забавный, как, казалось бы, безобидные проблемы могут быть право боль в а * как таковой. : D

Edit: Вот количество игрушечных данных,

x1 = x2 = [ 300. 350. 400. 449. 499. 548. 598. 648. 698. 748. 
      798. 848. 897. 947. 997. 1047. 1097. 1147. 1196. 1246. 
      1296. 1346. 1396. 1446. 1496. 1546. 1595. 1645. 1695. 1745.] 

y1 = [ 351. 413. 476. 561. 620. 678. 734. 789. 841. 891. 
     938. 982. 1023. 1062. 1099. 1133. 1165. 1195. 1223. 1250. 
     1274. 1298. 1320. 1340. 1360. 1378. 1395. 1411. 1426. 1441.] 

y2 = [ 80. 75. 70. 65. 62. 58. 58. 52. 48. 46. 44. 41. 38. 35. 32. 
     32. 29. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30.] 
+1

Я вижу два пути решения этой проблемы. Вы можете выполнить ручную интерполяцию, чтобы получить значения для «промежуточных» точек данных, или вы можете использовать функцию «interp2d» scipy для интерполяции http://docs.scipy.org/doc/scipy/reference/generated/scipy. interpolate.interp2d.html –

+0

Если вы дадите мне несколько входных данных для игры, тогда я покажу вам, как это сделать. –

+0

Я добавил данные. – obtmind

ответ

0

Так мне удалось решить мою проблему. Я выполнил некоторые предварительные операции над моими данными, как описано выше, установив x1 = x2 и, таким образом, экстраполировал значения ребер для f (x2).

import numpy as np 
import scipy.interpolate as interp 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

data1 = np.loadtxt('data1.dat') 
data2 = np.loadtxt('data2.dat') 

X = [] 
Y = [] 
Z = [] 

for i in data1: 
    for j in data2: 
     X.append(i[0]) 
     Y.append(j[0]) 
     Z.append(i[1]/j[1]) 

x_mesh,y_mesh, = np.meshgrid(np.linspace(300,50000,200), np.linspace(300,50000,200)) 

z_mesh = interp.griddata((X,Y),Z,(x_mesh,y_mesh),method='linear') 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
surf = ax.plot_surface(x_mesh,y_mesh,z_mesh,cstride=10,rstride=10,cmap='OrRd_r') 
plt.show()