Как использовать численные методы для аппроксимации решения интеграла - PullRequest
1 голос
/ 20 апреля 2019

У меня есть следующие интегралы (более подробно: https://math.stackexchange.com/questions/3193669/how-to-evaluate-the-line-integral-checking-stokes-theorem)

enter image description here

C_3 можно оценить с помощью тригонометрических трюков. Тогда вы можете решить это:

import sympy as sp
t = sp.symbols('t')
sp.Integral((1-sp.cos(t)-sp.sin(t))**2 * sp.exp(1-sp.cos(t)-sp.sin(t)) * (sp.sin(t)-sp.cos(t)), (t, 0, 2*sp.pi))

Проблема в C_1 и C_2. Их нельзя оценить хитростями. Затем я должен использовать численные методы.

Что вы предлагаете? Я пробовал с N(), но ничего не получил.

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Альтернатива: использовать quadpy (мой проект):

import quadpy
from numpy import cos, sin, exp, pi

c1, err1 = quadpy.line_segment.integrate_adaptive(
    lambda t: (1 + sin(t)) * exp(1 + cos(t)) * (-sin(t)),
    [0.0, 2 * pi],
    1.0e-10
)

c2, err2 = quadpy.line_segment.integrate_adaptive(
    lambda t: ((1 + cos(t))**2 + exp(1+cos(t)))*cos(t),
    [0.0, 2 * pi],
    1.0e-10
)

print("C1 = ", c1, ", estimated error: ", err1)
print("C2 = ", c2, ", estimated error: ", err2)
C1 =  -9.652617082755405 , estimated error:  2.0513709554864616e-11
C2 =  15.935802389560804 , estimated error:  6.646538563488704e-11
1 голос
/ 20 апреля 2019

Вы можете использовать scipy.integrate.quad функцию:

from scipy.integrate import quad
from numpy import cos, sin, exp, pi

f1 = lambda t: (1 + sin(t))*exp(1+cos(t))*(-sin(t))
f2 = lambda t: ((1 + cos(t))**2 + exp(1+cos(t)))*cos(t)

C1, err1 = quad(f1, 0, 2*pi)
C2, err2 = quad(f2, 0, 2*pi)

print("C1 = ", C1, ", estimated error: ", err1)
print("C2 = ", C2, ", estimated error: ", err2)

выход

C1 =  -9.652617083240306, estimated error:  2.549444932020608e-09
C2 =  15.93580239041989, estimated error:  3.4140955340600243e-10

EDIT : Вы также можете указать точность с помощью аргументов: epsrel: относительная ошибка, epsabs: абсолютная ошибка. Но это немного сложно (см. this ): мы указываем абсолютную погрешность цели ноль. Это условие не может быть выполнено, и поэтому цель относительной ошибки будет определять, когда интеграция прекращается.

C1, err1 = quad(f1, 0, 2*pi, epsrel=1e-10, epsabs=0)
print("C1 = ", C1, ", estimated error: ", err1)

Выход :

C1 =  -9.652617083240308 , estimated error:  1.4186554373311127e-13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...