如何评估此行积分(Python-Sympy)

问题描述 投票:0回答:2

想法是计算以下矢量场和曲线的线积分:

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)+ 1,sin(t)+ 1,-sin(t) - cos(t)+ 1]来起来。

那么我该如何计算这条线积分呢?

我认为这个行积分可能包含没有精确解的积分。如果您提供数值近似方法,也可以。

谢谢

python sympy numeric numerical-methods numerical-integration
2个回答
1
投票

您收到的价值错误并非来自您对line_integrate函数的调用;这是因为根据source code类的Curve,只支持2D欧几里德空间中的函数。根据this research blog,我发现只需在Google上搜索一个可行的方法,就可以在不使用sympy的情况下计算这个积分。

您需要的代码如下所示:

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然后将数值解存储到您的问题中。


1
投票

在这种情况下,您可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.