Запись рационального числа как функции в Sympy - PullRequest
0 голосов
/ 04 марта 2020

У меня на самом деле есть 2 вопроса (которые, я надеюсь, они связаны). Как я могу превратить рациональные числа в выражении сочувствия в дроби. Например, «0,25 * x + 0,5 * y», я хотел бы стать «1/4 * x + 1/2 * y». Второй вопрос: если я хочу заменить символ переменной на дробь, дробь автоматически преобразуется в десятичное число. Например, для eq = parse_expr("p1*cos(5*x)") выполнение eq = eq.subs("p1",1/5) дает мне 0.2cos (5?) вместо 1/5 * 0.2cos (5?). Конечно, они оба математически одинаковы, но я бы хотел, чтобы они были в более красивой, дробной форме. Как я могу это сделать? Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Поскольку вы работаете в Python, каждое написанное вами выражение проходит через семантику Python. Таким образом, 1/5 становится 0.25, прежде чем SymPy сможет что-либо с ним сделать. Это описано в файле gotchas.rst в документации.

Единственный раз, когда вы столкнетесь с этим, это когда у вас есть два ведущих числа в продукте, разделяющих друг друга, как в 1/5*x, но не x*1/5. В таких случаях вы можете предотвратить их превращение в число с плавающей точкой, заключив один из них в S(), чтобы сделать его номером SymPy, а не числом Python, например S(1)/5*x. Этот упреждающий шаг необходим во всех контекстах, где вы используете дробь чисел c отдельно или в качестве первого фактора в продукте

>>> x.subs(x, 1/5)
0.2
>>> x.subs(x, S(1)/5)
1/5

Если у вас есть выражение, в которое вы хотите преобразовать числа с плавающей точкой назад к Rationals вы можете использовать nsimplify(..., rational=True):

>>> nsimplify(0.25*x + 0.5*y, rational=True)
x/4 + y/2
0 голосов
/ 04 марта 2020

Вы можете использовать Rational . В первом случае напишите

Rational(0.25)*x + Rational(0.5)*y

или

Rational(1, 4)*x + Rational(1, 2)*y

, что дает вам x/4 + y/2. Во втором случае

eq.subs("p1", Rational(1, 5))  # cos(5*x)/5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...