如何在 Python 中定义多变量分段函数
How to Define a Piecewise Function in Python with Multiple Variables
我正在尝试为我的日震学绘制一个图 class,这个问题提供了一个分段函数来描述恒星中 "fluids" 的动力学,就好像它是一回事如果是另一个就是那个。我一遍又一遍地收到这个 'Mul' object cannot be interpreted as an integer
但我正在处理实数中的数字,而不仅仅是整数集。我不知道如何解决这个问题,需要指导。代码如下
import sympy as sy
from sympy import *
from sympy.physics.units import Unit
import numpy as np
import sys
import math
import scipy as sp
from scipy import special
phi = Symbol('phi', Variable = True)
x = Symbol('x', Variable = True, Real = True)
t = Symbol('t', Variable = True, Real = True)
xi = Symbol('xi', Function = True)
Solar_Radius = Symbol('R', Constant = True, unit = "meters")
Sound_Speed = Symbol('c', Constant = True, unit = "meters per second", Real = True)
gamma = Symbol('gamma', Constant = True)
gravity = Symbol('g', Constant = True, unit = "meters per second per second")
Solar_Radius = 6.963 * 10 ** 6
gamma = 5/3
g = 274.8265625336
gas_constant = 8201.25
c = 8.1 * 10 ** 3
for t in range(0,x/c):
xi[x,t] = 0
for t in range(x/c,00):
xi[x,t] = (1/2)*sy.exp(gamma*g*x/(2*c**2))*mpmath.besselj(0, (gamma*g/(2*c)*sy.sqrt(t**2 - ((x/c)**2))),derivative = 0)
完整追溯:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-50-3506376f1686> in <module>()
----> 1 for t in range(0,x/c):
2 xi[x,t] = 0
3 for t in range(x/c,00):
4 xi[x,t] = (1/2)*sy.exp(gamma*g*x/(2*c**2))*mpmath.besselj(0, (gamma*g/(2*c)*sy.sqrt(t**2 - ((x/c)**2))),derivative = 0)
TypeError: 'Mul' object cannot be interpreted as an integer
这里有不少问题:
None 您传递给 Symbol 的关键字参数(常量、变量、单位、实数)是 SymPy 可以识别的东西。唯一接近的是 real
,它应该是小写的(如 Symbol('x', real=True)
)。其余的什么都不做。如果你想要单位,你应该使用 sympy.physics.units
中的 SymPy 单位模块。无需指定符号是常量还是变量。
您已将 Solar_Radius
和 gamma
重新定义为数字。这意味着这些变量的符号定义毫无意义。
如果您使用 Python 2,请确保在文件顶部包含 from __future__ import division
,否则 1/2
和 5/3
将被整数除法截断(这在 Python 3 中不是问题)。
range(0, x/c)
没有意义。 range
创建一个数字列表,如 range(0, 3)
-> [0, 1, 2]
。但是x/c
不是一个数字,它是一个符号表达式。
此外,xi[x, t] = ...
没有意义。 xi
是一个Symbol,不允许索引,当然也不允许赋值。
不要将数字(math、mpmath、numpy、scipy)函数与 SymPy 函数混合使用。它们不适用于符号表达式。您应该只使用 SymPy 函数。如果您创建一个符号表达式并希望将其转换为数字表达式(例如,用于绘图),请使用 lambdify
.
这里你要的是Piecewise
。语法是 Piecewise((expr, cond), (expr, cond), ..., (expr, True))
,其中 expr
是当 cond
为真时使用的表达式((expr, True)
是 "otherwise" 条件)。
以你的例子,我相信你想要
expr = Piecewise((0, t < x/c), (sy.exp(gamma*g*x/(2*c**2))*sy.besselj(0, (gamma*g/(2*c)*sy.sqrt(t**2 - (x/c)**2)))/2, t >= x/c))
如果你想把它变成 x
和 t
中的数值函数,请使用
xi = lambdify((x, t), expr)
我正在尝试为我的日震学绘制一个图 class,这个问题提供了一个分段函数来描述恒星中 "fluids" 的动力学,就好像它是一回事如果是另一个就是那个。我一遍又一遍地收到这个 'Mul' object cannot be interpreted as an integer
但我正在处理实数中的数字,而不仅仅是整数集。我不知道如何解决这个问题,需要指导。代码如下
import sympy as sy
from sympy import *
from sympy.physics.units import Unit
import numpy as np
import sys
import math
import scipy as sp
from scipy import special
phi = Symbol('phi', Variable = True)
x = Symbol('x', Variable = True, Real = True)
t = Symbol('t', Variable = True, Real = True)
xi = Symbol('xi', Function = True)
Solar_Radius = Symbol('R', Constant = True, unit = "meters")
Sound_Speed = Symbol('c', Constant = True, unit = "meters per second", Real = True)
gamma = Symbol('gamma', Constant = True)
gravity = Symbol('g', Constant = True, unit = "meters per second per second")
Solar_Radius = 6.963 * 10 ** 6
gamma = 5/3
g = 274.8265625336
gas_constant = 8201.25
c = 8.1 * 10 ** 3
for t in range(0,x/c):
xi[x,t] = 0
for t in range(x/c,00):
xi[x,t] = (1/2)*sy.exp(gamma*g*x/(2*c**2))*mpmath.besselj(0, (gamma*g/(2*c)*sy.sqrt(t**2 - ((x/c)**2))),derivative = 0)
完整追溯:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-50-3506376f1686> in <module>()
----> 1 for t in range(0,x/c):
2 xi[x,t] = 0
3 for t in range(x/c,00):
4 xi[x,t] = (1/2)*sy.exp(gamma*g*x/(2*c**2))*mpmath.besselj(0, (gamma*g/(2*c)*sy.sqrt(t**2 - ((x/c)**2))),derivative = 0)
TypeError: 'Mul' object cannot be interpreted as an integer
这里有不少问题:
None 您传递给 Symbol 的关键字参数(常量、变量、单位、实数)是 SymPy 可以识别的东西。唯一接近的是
real
,它应该是小写的(如Symbol('x', real=True)
)。其余的什么都不做。如果你想要单位,你应该使用sympy.physics.units
中的 SymPy 单位模块。无需指定符号是常量还是变量。您已将
Solar_Radius
和gamma
重新定义为数字。这意味着这些变量的符号定义毫无意义。如果您使用 Python 2,请确保在文件顶部包含
from __future__ import division
,否则1/2
和5/3
将被整数除法截断(这在 Python 3 中不是问题)。range(0, x/c)
没有意义。range
创建一个数字列表,如range(0, 3)
->[0, 1, 2]
。但是x/c
不是一个数字,它是一个符号表达式。此外,
xi[x, t] = ...
没有意义。xi
是一个Symbol,不允许索引,当然也不允许赋值。不要将数字(math、mpmath、numpy、scipy)函数与 SymPy 函数混合使用。它们不适用于符号表达式。您应该只使用 SymPy 函数。如果您创建一个符号表达式并希望将其转换为数字表达式(例如,用于绘图),请使用
lambdify
.
这里你要的是Piecewise
。语法是 Piecewise((expr, cond), (expr, cond), ..., (expr, True))
,其中 expr
是当 cond
为真时使用的表达式((expr, True)
是 "otherwise" 条件)。
以你的例子,我相信你想要
expr = Piecewise((0, t < x/c), (sy.exp(gamma*g*x/(2*c**2))*sy.besselj(0, (gamma*g/(2*c)*sy.sqrt(t**2 - (x/c)**2)))/2, t >= x/c))
如果你想把它变成 x
和 t
中的数值函数,请使用
xi = lambdify((x, t), expr)