Как определить кусочную функцию в Python с несколькими переменными

#python #for-loop #sympy #bessel-functions

#python #для цикла #симпатия #бессель-функции

Вопрос:

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

Комментарии:

1. Очистите свой импорт. Затем разбейте это сложное утверждение на несколько шагов, чтобы увидеть, из какой строки будет исходить ошибка, пока вы не узнаете, какая операция или объект неисправны.

2. каждое из трех основных «рекламных объявлений» разделено, прошу прощения, если это ввело в заблуждение. проблема начинается в цикле for, и я не знаю почему. Я не буду знать, понятна ли функция Бесселя или нет, пока сначала не разберусь с этим

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

4. в нем говорится sympy.core.mul.Mul , что для type(x/c)

5. Не используйте * для импорта, это делает вещи более запутанными, чем они должны быть.

Ответ №1:

Здесь довольно много проблем:

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

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

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