Как оценить этот линейный интеграл (Python-Sympy) - PullRequest
0 голосов
/ 19 апреля 2019

Идея состоит в том, чтобы вычислить линейный интеграл следующего векторного поля и кривой:

enter image description here

enter image description here

Это код, который я пробовал:

import numpy as np
from sympy import *
from sympy import Curve, line_integrate
from sympy.abc import x, y, t
C = Curve([cos(t) + 1, sin(t) + 1, 1 - cos(t) - sin(t)], (t, 0, 2*np.pi))
line_integrate(y * exp(x) +  x**2 + exp(x) + z**2 * exp(z), C, [x, y, z])

Но аргумент ValueError: Function должен быть (x (t), y (t)), но получить [cos (t) + 1sin (t) + 1, -sin (t) - cos (t) + 1].

Как я могу тогда вычислить этот линейный интеграл?

Я думаю, что, возможно, этоЛинейный интеграл содержит интегралы, которые не имеют точного решения.Также хорошо, если вы предоставите метод числовой аппроксимации.

Спасибо

Ответы [ 2 ]

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

В этом случае вы можете вычислить интеграл с помощью line_integrate, потому что мы можем уменьшить 3d-интеграл до 2d. Извините, я не знаю Python достаточно хорошо, чтобы писать код, но вот упражнение: Если мы напишем

C(t) = x(t),y(t),z(t)

тогда следует отметить, что

z(t) = 3 - x(t) - y(t)

и так

dz = -dx - dy

Итак, мы можем написать

F.dr = Fx*dx + Fy*dy + Fz*dz
     = (Fx-Fz)*dx + (Fy-Fz)*dy

Итак, мы свели задачу к двумерной задаче: мы интегрируем

G = (Fx-Fz)*i + (Fx-Fz)*j

раунд

t -> x(t), y(t)

Обратите внимание, что в G нам нужно избавиться от z, подставив

z = 3 - x - y
1 голос
/ 19 апреля 2019

Ошибка значения, которую вы получаете, не является результатом вашего вызова функции line_integrate; это происходит потому, что согласно исходному коду для класса Curve поддерживаются только функции в евклидовом пространстве 2D. Этот интеграл все еще может быть вычислен без использования sympy в соответствии с этим исследовательским блогом , который я нашел простым поиском работоспособного метода в Google.

Код, который вам нужен, выглядит следующим образом:

import autograd.numpy as np
from autograd import elementwise_grad, grad, jacobian
from scipy.integrate import quad

def F(X):
    x, y, z = X
    return [y * np.exp(x), x**2 + np.exp(x), z**2 * np.exp(z)]

def C(t):
    return np.array([np.cos(t) + 1, np.sin(t) + 1, 1 - np.cos(t) - np.sin(t)])

dCdt = jacobian(C, 0)

def integrand(t):
    return F(C(t)) @ dCdt(t)

I, e = quad(integrand, 0, 2 * np.pi)

Переменная I затем сохраняет численное решение вашего вопроса.

...