想法是计算以下矢量场和曲线的线积分:
这是我尝试过的代码:
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]。
那我怎么计算这条线的积分?
我认为这条线积分可能包含没有确切解的积分。如果您提供数值近似方法,也可以。
谢谢
答案 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]