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