2024-09-28 01:32:34 发布
网友
我已经发布了关于这个主题的问题: Speeding up a closest point on a hyperbolic paraboloid algorithm
给定定义doubly ruled hyperbolic paraboloid的四个点(p0,p1,p2,p3),使用python的numpy模块计算其表面积的最佳(最快)方法是什么?在
这是一个数学问题,而不是编程,因此您可能需要与^{}上的人联系。但是,根据对上一个问题的回答,曲面可以参数化为:
s = p0 + u * (p1 - p0) + v * (p3 - p0) + u * v * (p2 - p3 - p1 + p0) = p0 + u * a + v * b + u * v * c
四个点所限定的面积是0 <= u <= 1和{}。在
0 <= u <= 1
通过微分可以得到两个与曲面相切的向量:
你可以得到一个向量,垂直于另外两个向量,范数等于它们所描述的平行四边形的面积,取它们的叉积:
A = t1 x t2 = a x b + u * a x c + v * c x b
简单地对A积分是很有诱惑力的,但是你想要积分的是它的范数,而不是向量本身。我试着把它给Mathematica,看看它是否能想出一些好的,封闭形式的解决方案,但它已经持续了几分钟了,没有到达任何地方。所以你不妨用数字来做:
def integrate_hypar(p0, p1, p2, p3, n=100): a = p1 - p0 b = p3 - p0 c = p2 - p3 - p1 + p0 delta = 1 / n u = np.linspace(0,1, num=n, endpoint=False) + delta / 2 axb = np.cross(a, b) axc = np.cross(a, c) cxb = np.cross(c, b) diff_areas = (axb + u[:, None, None] * axc + u[:, None] * cxb) * delta * delta diff_areas *= diff_areas diff_areas = np.sum(diff_areas, axis=-1) diff_areas = np.sqrt(diff_areas) return np.sum(diff_areas)
根据你另一个问题的数据,我得到:
p0 = np.array([1.15, 0.62, -1.01]) p1 = np.array([1.74, 0.86, -0.88]) p2 = np.array([1.79, 0.40, -1.46]) p3 = np.array([0.91, 0.79, -1.84]) >>> integrate_hypar(p0, p1, p2, p3) 0.54825122958719719
这是一个数学问题,而不是编程,因此您可能需要与^{} 上的人联系。但是,根据对上一个问题的回答,曲面可以参数化为:
四个点所限定的面积是}。在
0 <= u <= 1
和{通过微分可以得到两个与曲面相切的向量:
^{pr2}$你可以得到一个向量,垂直于另外两个向量,范数等于它们所描述的平行四边形的面积,取它们的叉积:
简单地对A积分是很有诱惑力的,但是你想要积分的是它的范数,而不是向量本身。我试着把它给Mathematica,看看它是否能想出一些好的,封闭形式的解决方案,但它已经持续了几分钟了,没有到达任何地方。所以你不妨用数字来做:
根据你另一个问题的数据,我得到:
相关问题 更多 >
编程相关推荐