#python #math #numerical-methods #numerical-integration #calculus
#python #математика #числовые методы #числовое интегрирование #исчисление
Вопрос:
Я нашел алгоритм, который вычисляет площадь под кривой функции, используя сумму Римана, также известную как аппроксимация прямоугольниками. Однако мне приходится менять функцию внутри алгоритма каждый раз, когда я хочу вычислить другую функцию. В приведенном ниже коде алгоритм настроен на вычисление площади под кривой x**2
.
# Calcuate the area under a curve
#
# Example Function y = x^2
#
# This program integrates the function from x1 to x2
# x2 must be greater than x1, otherwise the program will print an error message.
#
x1 = float(input(’x1=’))
x2 = float (input(’x2=’))
if x1 > x2:
print(’The calculated area will be negative’)
# Compute delta_x for the integration interval
#
delta_x = ((x2-x1)/1000)
j = abs ((x2-x1)/delta_x)
i = int (j)
print(’i =’, i)
# initialize
n=0
A= 0.0
x = x1
# Begin Numerical Integration
while n < i:
delta_A = x**2 * delta_x
x = x delta_x
A = A delta_A
n = n 1
print(’Area Under the Curve =’, A)
Я пытался попросить пользователя ввести функцию типа, скажем, exp((x** 2)-x) * sin(x**3)
from x1 = 1
to x2 = 2.5
, но это не работает, отображается сообщение об ошибке с недопустимым синтаксисом. Попытался использовать метод eval (input(…)) и он рассчитал, но дал неправильный ответ (1.2612 …). Правильный ответ для этой задачи — 2.397…
Переписывать функцию в алгоритме неудобно, это непрактично для пользователя.
Кто-нибудь может мне помочь, пожалуйста?
Комментарии:
1. Покажите код, который не работает. Вы уверены, что код, который вы используете для интеграции, правильный? Обратите внимание, что пакет scipy имеет готовые и протестированные функции интеграции, которые являются более точными.
2. Вы также можете использовать синтаксический анализ sympy: docs.sympy.org/latest/modules/parsing.html
3. Спасибо @Tarik за ваше предложение по использованию SciPy, я не знал об этом. Это будет очень полезно для меня.
4. Также взгляните на sympy.
Ответ №1:
Как прокомментировал @Tarik, сначала проверьте логику вашего кода.
Тогда попробуйте eval()
, примером может быть:
from math import exp,sin
def integration(func_string, x1, x2):
reverse = 0
if x1 > x2:
print('The calculated area will be negative')
reverse = 1
x1, x2 = x2, x1
delta_x = (x2 - x1) / 1000
# initialize
A = 0.0
x = x1
while x <= x2:
delta_A = eval(func_string) * delta_x
x = x delta_x
A = A delta_A
if reverse == 1:
A = -A
print('Area under the curve', A)
if __name__=='__main__':
x1 = float(input('x1='))
x2 = float(input('x2='))
integration('exp((x** 2)-x) * sin(x**3)', x1, x2)
Пример ввода-вывода:
x1=1
x2=2.5
Area under the curve 2.395500858985482
Комментарии:
1. Большое вам спасибо за ваше время. Я воспользуюсь тем, что предложил Тарик, SciPy. Я не знал об этой штуке SciPy, она очень, очень полезна для исчисления, инженерии и естественных наук. Я буду придерживаться его документации, я уверен, что это будет очень полезно. Еще раз спасибо.