2017-09-16 16 views
-1

私は問題の解決策を見つけようとしています。私は検索しましたが、私が見つけることができる最も近いものは、限られた成功。x-minとx-maxのポリゴンy-切片

私は、複数のポリゴンを、いくつかのx-y点によって与えられる別々の散布図として定義しています。私がしようとしているのは、y軸に水平線を描き、水平線がポリゴンと交差するx-minとx-maxの値を見つけることです。私はy値の全範囲についてこれをしたいと思います。だから理論的には、ループを進んで、y = 1、y = 2などに値を記録することができます。私が使用しているエンジニアリングソフトウェアでは、この形式の入力パラメータが必要です。

この問題への最善のアプローチに関するアドバイスや指針は非常に高く評価されています。

Sample plot image

import matplotlib.pyplot as plt 
import numpy as np 
x =[1,2.6,2.56,2.57,10,11.66,13.07,11.78,11.27,6.49,5.98,5.76,3.02,1.87,1] 
y =[15.59,15.09,15.14,15.15,16,17,25.47,26,27,27,28,28,26.67,16.37,15.59] 
plt.plot(x,y) 
plt.grid() 
plt.show() 
+2

あなたの質問は明らかではありません。散布図はどのようにポリゴンを定義しますか?ポリゴンは点の凸包です。ポイントはポリゴンの頂点ですか? 「y = 1、y = 2などの値を記録する」とはどういう意味ですか?おそらくy座標が1または2の点はないからでしょうか?なぜあなたはあなたが望むものを見つけるために 'min'と' max'関数を使うことができませんか?等々。 –

+0

お返事ありがとうございます、私は今いくつかのコードを追加しました。私はy軸に水平線を描き、その線がグラフと交差するx-minとx-maxの値を求めたいと思います。私は、0.2の増分でy値の全範囲に対してこれを行いたいと思います。 – Inrush

答えて

0

あなたは直線的にポリゴンがys==?によって定義されたラインを越えたものを2点間を補間することができます。これらの点を見つけるには、ポリゴンのyの値からysの値を引いて、符号が変わるポイントを見つけてそれらのポイントの最小値と最大値を求めます。

import numpy as np 
import matplotlib.pyplot as plt 

x =[1,2.6,2.56,2.57,10,11.66,13.07,11.78,11.27,6.49,5.98,5.76,3.02,1.87,1] 
y =[15.59,15.09,15.14,15.15,16,17,25.47,26,27,27,28,28,26.67,16.37,15.59] 

def findminmax(t, x, zero=0): 
    t = np.array(t); x = np.array(x) 
    ta = [] 
    p = (x-zero) > 0 
    ti = np.where(np.bitwise_xor(p[1:], p[:-1]))[0] 
    for i in ti: 
     y_ = np.sort(x[i:i+2]) 
     z_ = t[i:i+2][np.argsort(x[i:i+2])] 
     t_ = np.interp(zero, y_, z_) 
     ta.append(t_) 
    if ta: 
     return min(ta), max(ta) 
    else: 
     return None, None 

plt.plot(x,y) 

ys = np.arange(13, 29, 0.2) 
result = [] 
for s in ys: 
    mi, ma = findminmax(x,y,zero=s) 
    if mi and ma: 
     result.append([mi,ma,s]) 
     print("y = {}, minimum {}, maximum {}".format(s,mi,ma)) 
result=np.array(result) 

plt.scatter(result[:,0],result[:,2], label="min", color="limegreen") 
plt.scatter(result[:,1],result[:,2], label="max", color="crimson") 

plt.legend() 
plt.grid() 
plt.show() 

enter image description here

+0

うわー!私は時間をかけてくれてありがたいことに感謝することはできません。私は数日間、自分で解決策を作り出そうと努力してきました。ご多幸を祈る。 – Inrush

関連する問題