2016-10-03 195 views
0

我想为我的日出学课程开发一个情节,并且问题提供了一个分段函数来描述恒星中“流体”的动力学,就好像它是一回事它的这一点,如果它是另一个它的。我一遍又一遍地接收这个'Mul' object cannot be interpreted as an integer,但我正在使用实数中的数字,而不仅仅是整数集。我不知道如何解决这个问题,需要指导。代码如下。如何用多变量在Python中定义分段函数

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 
+0

清理进口。然后把这个复杂的语句分解成多个步骤,看看错误会来自哪一行,直到你知道什么操作或对象出错为止。 – Harrichael

+0

三大“混乱”中的每一个都是分开的,如果那是误导,我很抱歉。问题在for循环中开始,我不知道为什么。我不知道bessel函数是否清楚,直到我首先得到这个结果 – anabstudent

+0

看来(x/c)不能被解释为整数。你有没有看过是什么样的物体?有一个整数值有意义吗?如果是这样,请查看类型为(x/c)的对象类型,找到定义该类型的库以及Google“库类型整数表示形式”。 – Harrichael

回答

2

有相当这里的几个问题:

  • 无的要传递的关键字参数(常量,变量,单位,真实)符号是由SymPy识别的东西。唯一接近的是real,它应该是小写字母(如Symbol('x', real=True))。其余的什么都不做。如果你想要单位,你应该使用sympy.physics.units中的SymPy单位模块。没有必要指定符号是恒定的还是可变的。

  • 您已将Solar_Radiusgamma重新定义为数字。这意味着这些变量的符号定义是毫无意义的。

  • 如果您正在使用Python 2,确保包括from __future__ import division在文件的顶部,或者之类的东西1/25/3将与整数除法被截断(这不是在Python 3个问题)。

  • range(0, x/c)没有意义。 range创建一个数字列表,如range(0, 3) - >[0, 1, 2]。但x/c不是一个数字,它是一个象征性的表达。

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

  • 请勿将数字(数学,mpmath,numpy,scipy)函数与SymPy函数混合使用。他们不会使用符号表达式。您应该只使用SymPy函数。如果您创建符号表达式并希望将其转换为数字符号(例如,绘图),请使用lambdify

这里您要的是Piecewise。语法是Piecewise((expr, cond), (expr, cond), ..., (expr, True)),其中expr是在cond为真时使用的表达式((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)) 

如果你想变成一个数字功能xt,使用

xi = lambdify((x, t), expr)