Я работал над этим, чтобы построить функцию и вращаться по оси y и x. Затем используйте SymPy, чтобы получить площадь поверхности.
Я пытаюсь с терминала и запускаю файл .py
, оба занимают слишком много времени для вычисления интеграла, чтобы получить площадь поверхности.
это мой код:
import numpy as np
import sympy as sy
x = sy.Symbol("x")
def f(x):
return ((x**6) + 2)/ (8*x ** 2)
def fd(x):
return sy.simplify(sy.diff(f(x), x))
def vx(x):
return 2*np.pi*(f(x)*((1 + (fd(x) ** 2))**(1/2)))
vx = sy.integrate(vx(x), (x, 1, 3))
Мои вопросы:
sy.integrate
так долго? почти 30 минут .. эту функцию трудно вычислить?С терминала он даже не закончил вычислять интеграл, пока я не задал этот вопрос в SoF:
Это ответ от sy.integrate
:
0.392699081698724*Integral(2*(x**2 + 1)**1.0*Abs(x**4 - x**2 + 1)**1.0/x**5.0, (x, 1, 3)) + 0.392699081698724*Integral(x**1.0*(x**2 + 1)**1.0*Abs(x**4 - x**2 + 1)**1.0, (x, 1, 3))
почему он не подставляет значения x
в определенный интеграл?
Является
sy.integrate(vx(x), (x, 1, 3))
неправильно вычислять определенный интеграл?
Чтобы люди могли видеть мой полный код. Может быть, это будет полезно
Определенно не засоряйте функцию vx()
возвращаемым значением vx = sy.integrate(vx(x), (x, 1, 3))
. Это не должно влиять на результат, но это плохая практика и сбивает с толку.
Не могу воспроизвести. На моей машине интеграция занимает 26 секунд, 30 минут — это намного больше. Как вы запускаете этот код?
Sympy любит находить идеальные символические решения. Sympy очень путается с числами с плавающей запятой, поэтому вам следует заменить np.pi
на sy.pi
. К сожалению, из-за того, как работает Python, дроби также преобразуются в числа с плавающей запятой. Для них обходным путем является использование sy.S(1)/2
вместо 1/2
(или sy.sqrt
, если вам нужен квадратный корень).
Хорошо, прочитав ответ Оскара Бенджамина, все ваши комментарии и поработав самостоятельно, вы правы, я не должен был использовать np.pi
, я должен был использовать sy.pi
вместо этого. Таким образом, я исправил и работаю над этим. Моя машина — Dell Precision с 16 ГБ ОЗУ, обычным графическим процессором, ядром i7, но не таким быстрым.
Я не могу воспроизвести поведение, которое вы видите. Возможные различия заключаются в версии SymPy (вы используете последнюю версию?), а также в том, установлен ли gmpy2. Установка gmpy2 может значительно ускорить некоторые операции в SymPy.
Также вы, кажется, смешиваете поплавки и пустые вещи вместе. Вам нужно решить, хотите ли вы точного результата или нет. Если вы хотите получить точный результат, используйте sympy pi, а не numpy, а также используйте точные рациональные числа, а не число с плавающей запятой 1/2
. Наряду с призывом к упрощению перед интеграцией это даст точный результат:
In [20]: import numpy as np
...: import sympy as sy
...:
...: x = sy.Symbol("x")
...:
...: def f(x):
...: return ((x**6) + 2)/ (8*x ** 2)
...:
...: def fd(x):
...: return sy.simplify(sy.diff(f(x), x))
...:
...: def vx(x):
...: return 2*sy.pi*(f(x)*sy.sqrt(1 + (fd(x) ** 2)))
...:
...: vxi = sy.Integral(vx(x), (x, 1, 3))
In [21]: %time vxi.simplify().doit()
CPU times: user 1.74 s, sys: 0 ns, total: 1.74 s
Wall time: 1.74 s
Out[21]:
8429⋅π
──────
81
In [22]: _.evalf()
Out[22]: 326.919561445782
Тот факт, что вы используете поплавки, говорит о том, что вас не интересует точный результат, и в этом случае лучше просто оценить интеграл численно:
In [23]: %time vxi.evalf()
CPU times: user 392 ms, sys: 0 ns, total: 392 ms
Wall time: 388 ms
Out[23]: 326.919561445782
Зачем включать все эти пустые и сюжетные вещи, когда ваш вопрос касается расчета
vx
?