由MeshGrid值定义的曲面下的线积分-Python

问题描述

我需要计算由网格网格上的值定义的表面下两个点(x1,y1)和(x2,y2)之间的线积分。

enter image description here

我不确定使用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 (将#修改为@)