質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

指定のグラフの曲率半径を算出したい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 124

S.K12

score 11

前提・実現したいこと

下記のグラフの曲率半径をすべて算出したいです。
イメージ説明

最終的にグラフの曲率半径最小位置を求めたいと考えている為、
グラフの端からは端まですべての曲率半径を出力したいです。

該当ソースコード作成時に参考にしたサイトは下記の通りです。
Three Points Circle (Electronic Station) - 3点を通る円の方程式を求める

補足

原因がx,yの配列がnumpyである事だと思うのですが、
numpyではない通常(?)の配列への変換方法がわからず対処出来ていません。

また、冒頭の

x = np.array([[930.49552541],
     [930.50241252],
     [930.50936   ],
     [930.51581285],
     [930.52178554],... #長いので省略

y=np.array([[0.00434942],
     [0.00434728],
     [0.00434605],
     [0.00434515],
     [0.00434443],... #長いので省略

 
のコードを変えずに対処出来ないでしょうか。

発生している問題・エラーメッセージ

TypeError                                 Traceback (most recent call last)
<ipython-input-20-62b58ee62a61> in <module>
    257     Y3 = y[row_num]
    258 
--> 259     checkio("(X,Y),(X2,Y2),(X3,Y3)")
    260     R = r
    261 

<ipython-input-20-62b58ee62a61> in checkio(data)
    237     (x1, y1), (x2, y2), (x3, y3) = eval(data)
    238     (x0, y0), r = get_circle_center_and_radius(x1, y1, x2, y2, x3, y3)
--> 239     return make_equation(x0, y0, r)
    240 
    241 

<ipython-input-20-62b58ee62a61> in make_equation(x, y, r)
    232         return name if num == '0' else '({0}{1}{2})'.format(name, sign, num)
    233 
--> 234     return "{}^2+{}^2={}^2".format(make_part('x', x), make_part('y', y), format_float(r))
    235 
    236 def checkio(data):

<ipython-input-20-62b58ee62a61> in make_part(name, value)
    228 
    229     def make_part(name, value):
--> 230         num = format_float(abs(value))
    231         sign = '-' if value > 0 else '+'
    232         return name if num == '0' else '({0}{1}{2})'.format(name, sign, num)

<ipython-input-20-62b58ee62a61> in format_float(f)
    222 
    223     def format_float(f):
--> 224         result = str(round(f, 2))
    225         result = remove_suffix(result, '.00')
    226         result = remove_suffix(result, '.0')

TypeError: type numpy.ndarray doesn't define __round__ method

該当のソースコード

import math
import numpy as np

x =np.array([[930.49552541],
     [930.50241252],
     [930.50936   ],
     [930.51581285],
     [930.52178554],
     [930.52813743],
     [930.53590557],
     [930.54574973],
     [930.55803645],
     [930.57266836],
     [930.58935564],
     [930.60826951],
     [930.62884869],
     [930.64961964],
     [930.66947954],
     [930.68803344],
     [930.70490674],
     [930.7215936 ],
     [930.73982617],
     [930.75971803],
     [930.77935041],
     [930.79865324],
     [930.8207072 ],
     [930.8457263 ],
     [930.87278812],
     [930.90082988],
     [930.92861418],
     [930.95349711],
     [930.97389033],
     [930.99209669],
     [931.01197425],
     [931.03358981],
     [931.05703237],
     [931.08380651],
     [931.11410212],
     [931.14362348],
     [931.16924592],
     [931.19070421],
     [931.20623112],
     [931.2187767 ],
     [931.23142849],
     [931.24739802],
     [931.26840248],
     [931.29298588],
     [931.32298162],
     [931.35864627],
     [931.3950254 ],
     [931.43214055],
     [931.47362004],
     [931.51968795],
     [931.56676231],
     [931.60902366],
     [931.64616018],
     [931.68188711],
     [931.71813859],
     [931.75697725],
     [931.80058173],
     [931.84915365],
     [931.89639139],
     [931.93781723],
     [931.97537223],
     [932.01339803],
     [932.05415833],
     [932.09774788],
     [932.13955831],
     [932.17479712],
     [932.20562587],
     [932.23672897],
     [932.27051968],
     [932.30707133],
     [932.3489253 ],
     [932.39373234],
     [932.44158594],
     [932.49513548],
     [932.55457704],
     [932.61747775],
     [932.67859409],
     [932.7324024 ],
     [932.77589621],
     [932.80877703],
     [932.8363532 ],
     [932.86130171],
     [932.88638003],
     [932.91720118],
     [932.95670163],
     [933.00220653],
     [933.05387947],
     [933.11478805],
     [933.1763619 ],
     [933.22967197],
     [933.27447892],
     [933.31963668],
     [933.37122972],
     [933.42941259],
     [933.49435751],
     [933.56310613],
     [933.62940727],
     [933.69638453],
     [933.77050269],
     [933.8519677 ]])


y=np.array([[0.00434942],
     [0.00434728],
     [0.00434605],
     [0.00434515],
     [0.00434443],
     [0.00434375],
     [0.00434299],
     [0.00434213],
     [0.00434116],
     [0.00434013],
     [0.00433905],
     [0.00433795],
     [0.00433684],
     [0.00433581],
     [0.00433489],
     [0.00433407],
     [0.00433336],
     [0.00433269],
     [0.00433198],
     [0.00433124],
     [0.00433053],
     [0.00432986],
     [0.00432912],
     [0.00432831],
     [0.00432747],
     [0.00432662],
     [0.00432582],
     [0.00432511],
     [0.00432455],
     [0.00432406],
     [0.00432354],
     [0.00432298],
     [0.00432239],
     [0.00432172],
     [0.00432099],
     [0.0043203 ],
     [0.0043197 ],
     [0.00431922],
     [0.00431887],
     [0.00431859],
     [0.00431832],
     [0.00431797],
     [0.00431752],
     [0.004317  ],
     [0.00431637],
     [0.00431565],
     [0.00431492],
     [0.0043142 ],
     [0.0043134 ],
     [0.00431254],
     [0.00431168],
     [0.00431093],
     [0.00431027],
     [0.00430966],
     [0.00430904],
     [0.00430839],
     [0.00430767],
     [0.00430688],
     [0.00430613],
     [0.00430549],
     [0.00430491],
     [0.00430433],
     [0.00430371],
     [0.00430307],
     [0.00430246],
     [0.00430195],
     [0.00430151],
     [0.00430107],
     [0.00430059],
     [0.00430009],
     [0.00429951],
     [0.0042989 ],
     [0.00429826],
     [0.00429755],
     [0.00429678],
     [0.00429597],
     [0.0042952 ],
     [0.00429452],
     [0.00429399],
     [0.00429358],
     [0.00429325],
     [0.00429295],
     [0.00429265],
     [0.00429228],
     [0.00429181],
     [0.00429127],
     [0.00429067],
     [0.00428997],
     [0.00428927],
     [0.00428867],
     [0.00428817],
     [0.00428767],
     [0.00428711],
     [0.00428648],
     [0.00428578],
     [0.00428505],
     [0.00428436],
     [0.00428366],
     [0.0042829 ],
     [0.00428208]])


#(x1,y1)(x2,y2)(x3,y3)の3点を通る円の中心と半径を取得
def get_circle_center_and_radius(x1, y1, x2, y2, x3, y3):
    r = []
    d = 2 * ((y1 - y3) * (x1 - x2) - (y1 - y2) * (x1 - x3))
    x = ((y1 - y3) * (y1 ** 2 - y2 ** 2 + x1 ** 2 - x2 ** 2) - (y1 - y2) * (y1 ** 2 - y3 ** 2 + x1 ** 2 - x3 ** 2)) / d
    y = ((x1 - x3) * (x1 ** 2 - x2 ** 2 + y1 ** 2 - y2 ** 2) - (x1 - x2) * (x1 ** 2 - x3 ** 2 + y1 ** 2 - y3 ** 2)) / -d
    r = math.sqrt((x - x1) ** 2 + (y - y1) ** 2) #ここで求めたrを配列Rに格納していきたい
    return (x, y), r

#上記で算出した円の中心座標と半径より円の方程式の作成
def checkio(data):
    (x1, y1), (x2, y2), (x3, y3) = eval(data)
    (x0, y0), r = get_circle_center_and_radius(x1, y1, x2, y2, x3, y3)
    return make_equation(x0, y0, r)


i = 0
row_num = i
R = []
while i <= 100 :
    X = x[row_num] #1つ目の座標
    Y = y[row_num]

    i = i + 1
    row_num = i
    X2 = x[row_num] #2つ目の座標
    Y2 = y[row_num]

    i = i + 1
    row_num = i
    X3 = x[row_num] #3つ目の座標
    Y3 = y[row_num]

    checkio("(X,Y),(X2,Y2),(X3,Y3)") #上記3点から作られる円の方程式を算出
    R = r

print(R)

補足情報(FW/ツールのバージョンなど)

windows64bit
Anaconda

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sfdust

    2020/09/27 21:32 編集

    get_circle_center_and_radius(...)
    make_equation(x, y, r)
    checkio(data)
    各関数の内容および引数の意味を記載してください。

    キャンセル

  • S.K12

    2020/09/27 22:03

    ご指摘有難う御座います。該当内容の編集を行いました。

    キャンセル

回答 2

checkベストアンサー

+1

コードの下の方のwhile i <= 100 :の前に以下を挿入すると、xとyに関するエラーは無くなります。

x = np.ravel(x).tolist()
y = np.ravel(y).tolist()

ただし、新たに一番下の方のR = rで、rが定義されていない、というエラーが出ます。確かにrはどこにも定義されていないため、こちらの解決方法は、今のコードだけでは分かりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/28 00:50

    御回答有難うございます。
    元のエラーは無事に表示されなくなったのでとても助かりました。

    rの定義についてはwhile文の中に関数を入れる事で解決したのですが、
    出力が想定通りの物ではなかったので、もう少しいじってみてわからないようであればまた別の形で質問させて戴こうと思います。
    この度は有難う御座いました。

    キャンセル

+1

質問の該当のエラーは、

        result = str(round(f, 2))


        result = str(round(float(f), 2))


にするだけです。
あと、

    checkio("(X,Y),(X2,Y2),(X3,Y3)")


    r = checkio("(X,Y),(X2,Y2),(X3,Y3)")


とすれば未定義エラーは消えます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る