作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经发布了关于这个主题的问题: Speeding up a closest point on a hyperbolic paraboloid algorithm
给定四个点 (p0,p1,p2,p3) 来定义一个 doubly ruled hyperbolic paraboloid ,使用 python 的 numpy 模块计算其表面积的最佳(最快)方法是什么?
最佳答案
这更多的是数学而不是编程,所以你可能想通过 math.stackexchange
与人们联系。 .但是,根据您之前问题的答案,曲面可以参数化为:
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 <= v <= 1
.
通过微分可以得到与曲面相切的两个向量:
t1 = ds/du = a + v * c
t2 = ds/dv = b + u * c
然后你可以得到一个垂直于其他两个的向量,范数等于它们描述的平行四边形的面积,取它们的叉积:
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
关于python - Hypar(双曲抛物面)的表面积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902945/
我正在尝试拟合此 x 数据:[0.4,0.165,0.165,0.585,0.585],此 y 数据:[.45, .22, .63, .22, .63] 和此 z 数据: [1, 0.99, 0.98
我是一名优秀的程序员,十分优秀!