Допуск nsimplify не работает так, как задумано в выражениях symboli c - PullRequest
0 голосов
/ 20 марта 2020

Я работал над упрощением матрицы, которая относительно велика и содержит много символических c констант.

Основная цель состоит в том, чтобы обнулить термины, которые умножают символьные c константы и ниже указанного допуска c. Основная проблема, с которой я столкнулся, представлена ​​здесь: (она также представляет собой часть матрицы, над которой я работаю)

import sympy as sp
import numpy as np
AA         = sp.Symbol('m')
TestMatrix = Matrix([[0, 0, 0, 0, -143733*AA/15544162865157868, 0, -3793535*AA/205216068200524458, 1091672/883397, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, -72121*AA/59733839071490146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
sp.nsimplify(TestMatrix[0,4],tolerance=1e-6,rational=True)
sp.nsimplify(TestMatrix[0,4]/AA,tolerance=1e-6,rational=True)

вышеупомянутые 2 команды возвращают TestMatrix[0,4],TestMatrix[0,4]/AA

, тогда как

sp.nsimplify(np.float(TestMatrix[0,4]/AA),tolerance=1e-6,rational=True)

возвращает 0

Обратите внимание, что в основной матрице у меня много символов (и выражений типа 10**-10*a*b*x) в некоторых элементах, поэтому «плавающие» все коэффициенты из каждого символа и их комбинации не будет идеальным

1 Ответ

1 голос
/ 20 марта 2020

Кажется, вы неправильно понимаете tolerance, который используется для выбора того, насколько близко число должно быть к более простой форме, чтобы изменить ее. Например,

>>> nsimplify(3.14,[pi])
157/50
>>> nsimplify(3.14,[pi],tolerance=.01)
pi

Если вы хотите sh установить числа, меньшие заданного порогового значения, равными нулю, используйте replace:

>>> (y - 1e-7*x).replace(lambda x: x.is_Number and abs(x) < 1e-6, lambda x: 0)
y

Обратите внимание, что при работе с числами умноженные на неизвестные значения (символы), и эти символы заменяются большими числами, продукт может быть большим ... поэтому такое упрощение не рекомендуется. Но в духе unix я теперь показал вам, как «выстрелить себе в ногу». : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...