2016-10-03 7 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) 

Полный Traceback:

--------------------------------------------------------------------------- 
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, и я не знаю, почему. Я не буду знать, является ли функция бессела ясной или нет, пока я не получу это с первого взгляда. – anabstudent

+0

Кажется, что (x/c) нельзя интерпретировать как целое число. Вы посмотрели, что это за объект? Имеет ли смысл иметь целочисленное значение? Если это так, посмотрите тип объекта с типом (x/c), найдите библиотеку, которая определяет этот тип, и общее представление типа «тип библиотеки». – Harrichael

ответ

2

Есть немало вопросов здесь:

не
  • Ни один из именованных аргументов (константа, переменная, единицы, Real), которые вы передаете Symbol - это то, что признано SymPy. Единственное, что близко, это real, которое должно быть строчным (например, Symbol('x', real=True)). Остальные ничего не делают. Если вы хотите единицы, вы должны использовать модуль модулей SymPy в sympy.physics.units. Нет необходимости указывать, является ли символ постоянным или переменным.

  • Вы переопределили Solar_Radius и gamma как цифры. Это означает, что определения Symbol для этих переменных бессмысленны.

  • Если вы используете 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 - это символ, который не позволяет индексировать и, конечно же, не позволяет назначать.

  • Не смешивайте числовые функции (math, 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)) 

Если вы хотите, чтобы превратить это в числовой функции в x и t, используйте

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

 Смежные вопросы

  • Нет связанных вопросов^_^