2016-10-12 24 views
0

私が求めていることはできないかもしれませんが、皆さんが私を助けてくれることを願っています。複数の多項式フィッティングを使用した曲面プロット

私は2つの2D配列f1(x1)= y1とf2(x2)= y2を持っています。私はこれらの比の表面プロットを作成したいので、z次元は(f2(x2)/ f1(x1))です。残念ながら私は問題に近づく方向から壁に向かっています。

私の主な問題は、各アレイの範囲が異なり、x1は300から50,000になり、x2は300,1200になります。今、私はf2(x2)= f2(1200)すべてのx2> 1200です。しかし、この結びつきは、多項式をこの現実的な方法で適合させることは不可能です(私の最初のデータセットは5次の多項式でうまく再現され、2番目のデータセットは1番目次数多項式)。私が関数を(x2、y2)に当てはめることができる代替方法があるので、境界外のすべての点の境界値が必要ですか?

私の非常に間違った試みは、一見無害な問題は、* SE Aの右の痛みがいかにおかしい

# 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

編集:ここではおもちゃのデータの量は、だから私は私の問題を解決するために管理

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

この問題を解決する方法は2つあります。手動補間を行って "中間"データポイントの値を取得するか、scipyの 'interp2d'関数を使って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() 
関連する問題