繁体   English   中英

同情替换后 python 中的 NaN 类型

[英]NaN type in python after sympy substitution

我尝试在 sympy 表达式中替换变量,但替换后我得到 NaN 类型,我不明白为什么。

这是代码:

import sympy as sp
import copy
import numpy as np
import itertools as it
import matplotlib.pyplot as plt

alpha_set_values = np.linspace(0, 5, 10000)
beta_set_values = np.linspace(0, 6, 10000)

def plot_expr(exprVal, points):
  for point in points:
    value = exprVal.subs( [ (beta,point[0]), (alpha, point[1]) ] )
    print(type(value))
    if value > 0:
      plt.scatter([beta], [alpha], color = 'r')
    else:
      plt.scatter([beta], [alpha], color = 'b')

  plt.show()
plot_expr(expr1, points)

expr1是带有符号 alpha 和 beta (α*(1 - 0.1/β) + α - 0.3 α/β + 2 - 1.9β - 0.1 α - β)/β) 的 sympy 表达式。 替换后,的数据类型为 NaN

此处的完整代码是 google colab 链接。 最后 2 个单元格很重要,必须运行 - 最后一个单元格中缺少错误

你得到 Nan 是因为你的第一个点是(0, 0) 看看你的表达, expr1

α*(1 - 0.1/β) + α - 0.3*α/β + 2 - 1.9*(α*β - 0.1*α - β)/β

特别是,条款:

  • α*(1 - 0.1/β) :替换后,sympy 计算0 * (1 - zoo)结果为Nan
  • 此外, α/β可能导致NaN

我明白你在做什么:实现你的目标的最好方法是使用plot_implicit

sp.plot_implicit(expr1 > 0, (beta, 0, 6), (alpha, 0, 5))

或者,如果您希望 go 继续您的方法,请考虑从与零略有不同的值开始。 此外,为了加速计算和绘图,使用sp.lambdify将符号表达式转换为数值 function:

n = 100
alpha_set_values = np.linspace(1e-06, 5, n)
beta_set_values = np.linspace(1e-06, 6, n)
alpha_set_values, beta_set_values = np.meshgrid(alpha_set_values, beta_set_values)

f = sp.lambdify([alpha, beta], expr1)
res = f(alpha_set_values, beta_set_values)

alpha_set_values = alpha_set_values.flatten()
beta_set_values = beta_set_values.flatten()
res = res.flatten()
idx = res > 0

plt.figure()
plt.scatter(beta_set_values[idx], alpha_set_values[idx], color="r")
plt.scatter(beta_set_values[~idx], alpha_set_values[~idx], color="b")
plt.show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM