如何评估这条线积分(Python-Sympy)

时间:2019-04-19 14:58:18

标签: python sympy numeric numerical-methods numerical-integration

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

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]。

那我怎么计算这条线的积分?

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

谢谢

3 个答案:

答案 0 :(得分:1)

您收到的值错误并非来自调用line_integrate函数;这是因为根据Curve类的source code,仅支持2D欧几里得空间中的函数。仍然可以在不根据this research blog使用sympy的情况下计算该积分,而我只是通过在Google上搜索可行的方法而发现的。{p>

您需要的代码如下:

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 :(得分: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

答案 2 :(得分:0)

您可以定义一个函数:

import sympy as sp
from sympy import *
def linea3(f,C):
 P = f[0].subs([(x,C[0]),(y,C[1]),(z,C[2])])
 Q = f[1].subs([(x,C[0]),(y,C[1]),(z,C[2])])
 R = f[2].subs([(x,C[0]),(y,C[1]),(z,C[2])])
 dx = diff(C[0],t)
 dy = diff(C[1],t)
 dz = diff(C[2],t)
 m = integrate(P*dx+Q*dy+R*dz,(t,C[3],C[4]))
 return m

然后使用示例:

 f = [x**2*z**2,y**2*z**2,x*y*z]
 C = [2*cos(t),2*sin(t),4,0,2*sp.pi]