问题描述
我需要计算由网格网格上的值定义的表面下两个点(x1,y1)和(x2,y2)之间的线积分。
我不确定使用python进行此过程的最佳工具/方法。
由于我没有一个表示表面的函数,因此我假设我需要使用以下方法之一
: trapz -- Use trapezoidal rule to compute integral from samples.
cumtrapz -- Use trapezoidal rule to cumulatively compute integral.
simps -- Use Simpson's rule to compute integral from samples.
romb -- Use Romberg Integration to compute integral from
(2**k + 1) evenly-spaced samples.
任何帮助或指导将不胜感激。
编辑:
import numpy as np
from scipy import interpolate
def f(x,y):
return x**2 + x*y + y*2 + 1
xl = np.linspace(-1.5,1.5,101,endpoint = True)
X,Y = np.meshgrid(xl,xl)
Z = f(X,Y)
#And a 2D Line:
arr_2D = np.linspace(start=[-1,1.2],stop=[0,1.5],num=101,endpoint =
True) #Creates a 2D line between these two points
#Then we create a multidimensional linear interpolator:
XY = np.stack([X.ravel(),Y.ravel()]).T
S = interpolate.LinearNDInterpolator(XY,Z.ravel())
print(S)
#To interpolate points from 2D curve on the 3D surface:
St = S(arr_2D)
#We also compute the curvilinear coordinates of the 2D curve:
#Using curvilinear coordinates based on cumulative arc length,the integral to solve looks like:
Sd = np.cumsum(np.sqrt(np.sum(np.diff(arr_2D,axis=0)**2,axis=1)))
print(Sd)
I = np.trapz(St[:-1],Sd) # 2.041770932394164
print("Integral: ",I)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = plt.axes(projection="3d")
x_line = np.linspace(start=[-1],stop=[1.5],num=100,endpoint = True)
y_line = np.linspace(start=[-1.2],endpoint = True)
ax.plot3D(x_line,y_line,'red') #Line which represents integral
ax.plot_wireframe(X,Y,Z,color='green') #Represents the surface
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('Time')
plt.show()
fig = plt.figure()
ax = plt.axes()
ax.fill_between(Sd,St)
ax.set_xlabel('x')
ax.set_ylabel('Z')
plt.show()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)