如何评估这条线积分(Python-Sympy)
How to evaluate this line integral (Python-Sympy)
思路是计算以下向量场和曲线的线积分:
这是我试过的代码:
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] 出现。
那我怎么计算这个线积分呢?
我认为这条线积分可能包含没有精确解的积分。如果你提供一个数值逼近的方法也可以。
谢谢
您收到的值错误并非来自您对 line_integrate
函数的调用;这是因为根据 source code for the Curve
class, only functions in 2D Euclidean space are supported. This integral can still be computed without using sympy according to this research blog 我通过简单地在 Google.
上搜索可行的方法找到的
您需要的代码如下所示:
import autograd.numpy as np
from autograd import 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
存储您问题的数值解。
在这种情况下,您可以使用 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
你可以定义一个函数:
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]
思路是计算以下向量场和曲线的线积分:
这是我试过的代码:
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] 出现。
那我怎么计算这个线积分呢?
我认为这条线积分可能包含没有精确解的积分。如果你提供一个数值逼近的方法也可以。
谢谢
您收到的值错误并非来自您对 line_integrate
函数的调用;这是因为根据 source code for the Curve
class, only functions in 2D Euclidean space are supported. This integral can still be computed without using sympy according to this research blog 我通过简单地在 Google.
您需要的代码如下所示:
import autograd.numpy as np
from autograd import 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
存储您问题的数值解。
在这种情况下,您可以使用 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 中,我们需要通过代入
来摆脱 zz = 3 - x - y
你可以定义一个函数:
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]