如何使用多变量在Python中定义分段函数

如何使用多变量在Python中定义分段函数,python,for-loop,sympy,bessel-functions,Python,For Loop,Sympy,Bessel Functions,我正试图为我的太阳地震学课程绘制一个图,这个问题提供了一个分段函数,描述了恒星中“流体”的动力学,就好像它是一件事,它是这个,如果它是另一件事,它是那个。我一次又一次地接收到这个“Mul”对象不能解释为整数,但我处理的是实数,而不仅仅是整数集。我不知道如何避开这个问题,需要指导。代码如下 import sympy as sy from sympy import * from sympy.physics.units import Unit import numpy as np import sys

我正试图为我的太阳地震学课程绘制一个图,这个问题提供了一个分段函数,描述了恒星中“流体”的动力学,就好像它是一件事,它是这个,如果它是另一件事,它是那个。我一次又一次地接收到这个
“Mul”对象不能解释为整数
,但我处理的是实数,而不仅仅是整数集。我不知道如何避开这个问题,需要指导。代码如下

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
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1适用于范围(0,x/c)内的t:
2xi[x,t]=0
3适用于范围内的t(x/c,00):
4xi[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)),导数=0)
TypeError:“Mul”对象不能解释为整数

这里有很多问题:

  • 传递给Symbol的关键字参数(常量、变量、单位、实数)都不是SymPy可以识别的。唯一接近的是
    real
    ,它应该是小写的(比如
    Symbol('x',real=True)
    )。其余的什么也不做。如果需要单位,应使用
    symphy.physics.units
    中的symphy单位模块。无需指定符号是常量还是变量

  • 您已将
    太阳半径
    伽马
    重新定义为数字。这意味着这些变量的符号定义是毫无意义的

  • 如果您使用的是Python 2,请确保在文件顶部包含来自uuu future uuuu import division的
    ,否则像
    1/2
    5/3
    之类的内容将被整数除法截断(这在Python 3中不是问题)

  • 范围(0,x/c)
    没有意义
    range
    创建一个数字列表,如
    range(0,3)
    ->
    [0,1,2]
    。但是
    x/c
    不是一个数字,它是一个符号表达式

  • 此外,
    xi[x,t]=…
    没有意义
    xi
    是一个符号,它不允许索引,当然也不允许赋值

  • 不要将数字(math、mpmath、numpy、scipy)函数与SymPy函数混合使用。它们不适用于符号表达式。您应该只使用SymPy函数。如果创建符号表达式并希望将其转换为数字表达式(例如,用于打印),请使用
    lambdify

这里需要的是分段的
。语法是分段的((expr,cond),(expr,cond),…,(expr,True))
,其中
expr
是当
cond
为True时使用的表达式(
(expr,True)
是“否则”条件)

以你为例,我相信你想要

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))

这里有很多问题:

  • 传递给Symbol的关键字参数(常量、变量、单位、实数)都不是SymPy可以识别的。唯一接近的是
    real
    ,它应该是小写的(比如
    Symbol('x',real=True)
    )。其余的什么也不做。如果需要单位,应使用
    symphy.physics.units
    中的symphy单位模块。无需指定符号是常量还是变量

  • 您已将
    太阳半径
    伽马
    重新定义为数字。这意味着这些变量的符号定义是毫无意义的

  • 如果您使用的是Python 2,请确保在文件顶部包含来自uuu future uuuu import division的
    ,否则像
    1/2
    5/3
    之类的内容将被整数除法截断(这在Python 3中不是问题)

  • 范围(0,x/c)
    没有意义
    range
    创建一个数字列表,如
    range(0,3)
    ->
    [0,1,2]
    。但是
    x/c
    不是一个数字,它是一个符号表达式

  • 此外,
    xi[x,t]=…
    没有意义
    xi
    是一个符号,它不允许索引,当然也不允许赋值

  • 不要将数字(math、mpmath、numpy、scipy)函数与SymPy函数混合使用。它们不适用于符号表达式。您应该只使用SymPy函数。如果创建符号表达式并希望将其转换为数字表达式(例如,用于打印),请使用
    lambdify

这里需要的是分段的
。语法是分段的((expr,cond),(expr,cond),…,(expr,True))
,其中
expr
是当
cond
为True时使用的表达式(
(expr,True)
是“否则”条件)

以你为例,我相信你想要

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))

清理你的进口商品。然后将这个复杂的陈述分成多个步骤,看看错误来自哪一行,直到你知道什么操作或对象出错。三个主要的“模糊”都是分开的,如果这是误导的话,我很抱歉。问题从for循环开始,我不知道为什么。我不知道贝塞尔函数是否清晰,除非我先把它弄清楚,(x/c)似乎不能解释为整数。你看过那是什么东西吗?整数值有意义吗?如果是这样,请查看类型为(x/c)的对象类型,找到定义该类型的库,然后用谷歌搜索“库类型整数表示法”。对于
类型(x/c)
不要使用
*
进行导入,这会使事情比需要的更混乱。请清理导入。然后将这个复杂的语句分解为多个步骤,以查看错误将来自哪一行,直到您知道操作或对象是什么