Pythonで関数の極値を求めるプログラムを作成したい
解決したいこと
関数の極値を求めるプログラムの作成途中、極値のX座標が虚数になるときは、作動しないようにしたかったのですが、上手く作動しません。また、[d1]をプリントしようとしたところ、一つしかプリントされませんでした。解決方法を教えて下さい。
発生している問題・エラー
in
129 print("この関数においては極値のx座標の一部が複素数となるため、判定できかねます。")
130 else:
--> 131 if k1 > 0:
132 print("x=",d1,"のとき極大値",y1)
133 elif k1 < 0:
/usr/local/lib/python3.8/dist-packages/sympy/core/relational.py in bool(self)
393
394 def bool(self):
--> 395 raise TypeError("cannot determine truth value of Relational")
396
397 def _eval_as_set(self):
TypeError: cannot determine truth value of Relational
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
### 該当するソースコード
```python
import random
import math
import sympy as sym
from sympy.plotting import plot
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sympy
import numpy as npy
!pip install japanize-matplotlib
import japanize_matplotlib
from scipy import signal
num0 = random.randint(1,10)
num1 = random.randint(-10,10)
num2 = random.randint(-10,10)
num3 = random.randint(-10,10)
num4 = random.randint(-10,10)
x,y = sym.symbols("x y")
y = int(num0) * x ** 4 +int(num1) * x ** 3 + int(num2) * x ** 2 + int(num3) * x + int(num4)
y_d = sym.Derivative(y).doit()
y__d = sym.Derivative(y_d).doit()
d1 = sympy.solve(y_d , x)
D = -4 * int(num0) * int(num2) **3 -27 * int(num0) ** 2 * int(num3) ** 2 + int(num1) ** 2 *int(num2) ** 2 + 18 * int(num0) * int(num1) * int(num2) * int(num3) * int(num4) -4 * int(num1) ** 3 * int(num3)
if D <= 0:
print("3つの極値なし")
else:
for d1 in d1:
y1 = y.subs(x,d1)
k1 = y__d.subs(x,d1)
if type(d1) is complex:
print("この関数においては極値のx座標の一部が複素数となるため、判定できかねます。")
else:
if k1 > 0:
print("x=",d1,"のとき極大値",y1)
elif k1 < 0:
print("x=",d1,"のとき極小値",y1
自分で試したこと
三次関数で近いプログラムを作り、k>0以外のプログラムは恐らく作動することを確認しました。