前提・実現したいこと
python 初心者です.
関数z(x)を微分して法線を求め,その法線の傾き値(度表記)を求めようとしています.
また,傾き値はその座標値(a,z(a))の値で変化すると思いますが,aが0.1間隔で0から6まで変化した分だけの情報(すばわち60個分の傾き値)が欲しいです.
下図がイメージです.
発生している問題・エラーメッセージ
インターネットなどでやり方を探しているのですが,初心者ということもあり,やり方がわかりません.
該当のソースコード
Python
1 2#傾き値の取得 3 4import numpy as np 5import matplotlib.pyplot as plt 6 7# 描画範囲の指定 8# x = np.arange(x軸の最小値, x軸の最大値, 刻み) 9x = np.arange(0, 6.28, 0.1) 10 11plt.grid(True) 12plt.xlabel('$x$', fontsize=16) 13plt.ylabel('$Z$', fontsize=16) 14plt.title('upper die') 15 16#縦横比1:1 17plt.gca().set_aspect('equal', adjustable='box') 18 19R=-19.41053 20k=-59.85017 21c=1/R 22 23from sympy import Symbol, Derivative 24#xを変数xに指定 25x=Symbol('x') 26 27#関数入力 28z=-(c*x**2/(1+(1-(1+k)*c**2*x**2)**(1/2)) 29#入力関数を指定変数で微分 30Z=Derivative(z,x).doit() 31 32# 横軸の変数。縦軸の変数。 33plt.plot(x,Z) 34 35# 描画実行 36plt.show() 37 38np.savetxt("points.csv", np.vstack([x, Z]).T, delimiter=",")
微分を行うところまでは,teratailユーザーのご協力もあり出来ましたが,ここから先,行き詰っています.
知識のある方,ご協力をお願い致します.
編集後
Python
1#法線の角度を求める 2 3import matplotlib.pyplot as plt 4import numpy as np 5from sympy import * 6from sympy import Derivative, Symbol, N 7 8 9 10# xを変数xに指定 11x = Symbol('x') 12z = -(c*x**2/(1+(1-(1+k)*c**2*x**2)**(1/2)) 13 14prime_z = Derivative(z, x).doit() 15 16a = Symbol('a') 17z_a = z.subs(x, a) # f(a) 18prime_z_a = prime_z.subs(x, a) # 点 (a, f(a)) の傾き 19tangent = prime_z_a * (x - a) + z_a # 点 (a, f(a)) の接線 20normal = (-1 / prime_z_a) * (x - a) + z_a # 点 (a, f(a)) の法線 21theta = deg(atan(-1 / prime_z_a)) # 法線の角度 22print('{} degree'.format(theta.evalf(subs={a: x, prime_z_a: x}))) 23 24# x, theta の点一覧を作成する。 25xs = np.arange(0, 6.28, 0.1) 26thetas = [theta.evalf(subs={x: v}) for v in xs] 27 28# 描画する。 29fig, ax = plt.subplots(figsize=(7, 7)) 30plt.grid(True) 31plt.xlabel('$x$', fontsize=16) 32plt.ylabel('$θ$', fontsize=16) 33plt.title('upper die') 34plt.plot(xs, thetas) 35plt.show() 36 37np.savetxt("points.csv", np.vstack([xs,thetas]).T, delimiter=",")
を入力すると,
>>> # 描画する。 ... fig, ax = plt.subplots(figsize=(7, 7)) >>> plt.grid(True) >>> plt.xlabel('$x$', fontsize=16) Text(0.5,0,'$x$') >>> plt.ylabel('$θ$', fontsize=16) Text(0,0.5,'$\x83\xc6$') >>> plt.title('upper die') Text(0.5,1,'upper die') >>> plt.plot(xs, thetas) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\pyplot.py", line 3363, in plot ret = ax.plot(*args, **kwargs) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\__init__.py", line 1867, in inner return func(ax, *args, **kwargs) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\axes\_axes.py", line 1529, in plot self.add_line(line) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\axes\_base.py", line 1960, in add_line self._update_line_limits(line) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\axes\_base.py", line 1982, in _update_line_limits path = line.get_path() File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\lines.py", line 956, in get_path self.recache() File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\lines.py", line 657, in recache y = _to_unmasked_float_array(yconv).ravel() File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\matplotlib\cbook\__init__.py", line 2052, in _to_unmasked_float_array return np.asarray(x, float) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\numpy\core\numeric.py", line 501, in asarray return array(a, dtype, copy=False, order=order) File "C:\Users\owner\Anaconda3\envs\python3.6\lib\site-packages\sympy\core\expr.py", line 225, in __float__ raise TypeError("can't convert expression to float") TypeError: can't convert expression to float >>> plt.show()
この様なエラーが出てしまいます.
補足情報(FW/ツールのバージョンなど)
python3.6を使用しています.
回答1件
あなたの回答
tips
プレビュー