想法是计算以下矢量场和曲线的线积分:
这是我尝试过的代码:
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类的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
然后将数值解存储到您的问题中。
在这种情况下,您可以使用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