min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

Pythonからはじめる数学入門p120 ユーザーが入力した数式のグラフを描く

コレ前からやりたかった

入力した数式のグラフを描く。

$ python3 myKINRImath15.py

y = 2x + 3 のグラフ

 

y = xの4乗 -30かけるxの2乗 +10x のグラフ

 

y = xの5乗 -30かけるxの3乗 +50x のグラフ

こりゃ楽しい。Webからの入力インターフェースも作ってみるかな。

 

2つのグラフを1画像にプロットするのもできた。

$ python3 myKINRImath16.py

面白すぎる。

あとでチャート式の古本でも取り寄せて入力しまくってみよう。

 

※先人がいた(当然か)

www.geogebra.org

 

$ cat myKINRImath15.py

print('Pythonからはじめる数学入門 20240901')
print('-------------------------------')
print('p203 高階微分と極大極小の計算 で作ったコードを使って')
print('-------------------------------')
print('p120 入力した関数のグラフを描くコード')
print('-------------------------------')

from sympy import Symbol, Derivative, sympify, pprint, pretty
from sympy.core.sympify import SympifyError
#ChatGPT from sympy import sympify, Symbol

import numpy as np
import matplotlib.pyplot as plt

import datetime
from datetime import datetime as dt
import sys
import os


# 現在の日時を取得
#execution_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
myTIMEE = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
myARG0 = os.path.basename(__file__)

# ユーザーに方程式を入力させる
try:
    equation_input = input("プロットしたい方程式を入力してください(例: x**5 - 30*x**3 + 50*x): ")
    x = Symbol('x')
    equation = sympify(equation_input)
    #きれいな乗数表記をグラフのタイトルや吹き出しコメントで表示するために、SymPyのpretty関数やLaTeX形式を活用
    pretty_equation = pretty(equation)
except (SyntaxError, ValueError) as e:
    print(f"エラー: 入力が無効です: {e}")
    sys.exit(1)

## xの範囲を設定
## x = np.linspace(-5, 5, 400)
## x = np.linspace(-10, 10, 400)
x_vals = np.linspace(-5, 5, 400)

## 方程式を定義
## y = x**5 - 30*x**3 + 50*x
## y = 2*x + 3
# 方程式を評価してy値を計算
y_vals = [equation.subs(x, val) for val in x_vals]


# グラフをプロット
plt.figure(figsize=(8, 6))
# plt.plot(x, y, label=r"$x^5 - 30x^3 + 50x$")
#plt.plot(x, y, label=r"$2x + 3$")
plt.plot(x_vals, y_vals, label=f"${equation_input}$")

# y軸を中央に配置
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.gca().spines['left'].set_position('zero')
plt.gca().spines['left'].set_color('black')
plt.gca().spines['bottom'].set_position('zero')
plt.gca().spines['bottom'].set_color('black')

# 右と上の枠線を消す
plt.gca().spines['right'].set_color('none')
plt.gca().spines['top'].set_color('none')

plt.xlabel('x')
plt.ylabel('y')
#plt.title('Plot of $x^5 - 30x^3 + 50x$')
# plt.title('Plot of 2x + 3')
plt.title(f'Plot of ${equation_input}$')
#plt.title(f'Plot of ${pretty_equation}$')
plt.grid(True)
plt.legend()

# コメントをx軸の下に追加
# plt.figtext(0.5, -0.1, f"Script: {myARG0} | Executed on: {execution_time}", ha="center", fontsize=10)
# plt.figtext(0.5, -0.1, f"Script: {myARG0} | Executed on: {myTIMEE}", ha="center", fontsize=10)
kawacom = ''
kawacom =  datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S') + ' \n(' + myARG0 + ')'

## plt.xlabel(kawacom)
# コメントをx軸の欄外に追加
# plt.figtext(0.5, -0.2, kawacom, ha="center", fontsize=10)
plt.figtext(0.5, 0.01, kawacom, ha="center", fontsize=10)

# 数式を吹き出しコメントとして表示
# plt.annotate(rf"${equation_input}$", xy=(0.5, 0.5), xytext=(0.5, 0.75),
#     textcoords='axes fraction', ha='center', va='center',
#     bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5),
#     arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.5'))


#math12 # グラフをプロット
#math12 plt.figure(figsize=(8, 6))
#math12 plt.plot(x, y, label=r"$x^5 - 30x^3 + 50x$")
#math12 plt.xlabel('x')
#math12 plt.ylabel('y')
#math12 plt.title('Plot of $x^5 - 30x^3 + 50x$')
#math12 plt.grid(True)
#math12 plt.legend()

myPNG = 'myKINRImath15.png'
# PNG形式で保存
# plt.savefig('myKINRImath12.png')
# plt.savefig(myPNG)
plt.savefig(myPNG, bbox_inches='tight')
#plt.show()
print('-------------------------------')
print(myPNG + ' を保存しました')
print('(yの座標軸を画面中央に表示した版)')
print('-------------------------------')
print('http://192.168.3.11:5000/PT3/doLSglob.php?CHDIR=PT3&GREPWORD=myKINRI&MKSORT=goMKSORT')

# def derivative(f, var):
#     var = Symbol(var)
#     d = Derivative(f, var).doit()
#     pprint(d)
#
# if __name__ == '__main__':
#     print('Enter a function:')
#     f = input('微分したい(高次元の)関数を入力せよ:\n 例 2*x**2 + 3*x + 1 \n')
#     print('-------------------------------------')
#     print('Enter the variable to differentiate with respect to: ')
#     var = input('微分に使う変数を指定せよ(xとか) :')
#     print('-------------------------------------')
#     try:
#         f = sympify(f)
#     except SympifyError:
#         print('Invalid input 不正な入力です')
#     else:
#         derivative(f, var)

 

 

1,000万円を超えたbitcoinを少しだけどもらえるURL

https://bitflyer.com/invitation?id=l50e5ljw&lang=ja-JP

ハピタスからポイントもらえるURL

その買うを、もっとハッピーに。|ハピタス