Как использовать пользовательский ввод в качестве функции для алгоритма числового интегрирования?

#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, она очень, очень полезна для исчисления, инженерии и естественных наук. Я буду придерживаться его документации, я уверен, что это будет очень полезно. Еще раз спасибо.