在有限元方法中,我们需要知道有限元空间的基。例如,空间的基础
是具有顶点 (0,0,0)、(1,0,0)、(0,1,0) 和 (0,0,1) 的四面体上次数小于或等于 1 的多项式的典型基)。
但是,这是基础和? 我知道维度分别是 10 和 20,但我不知道如何推导它。
在有限元方法中,我们需要知道有限元空间的基。例如,空间的基础
是具有顶点 (0,0,0)、(1,0,0)、(0,1,0) 和 (0,0,1) 的四面体上次数小于或等于 1 的多项式的典型基)。
但是,这是基础和? 我知道维度分别是 10 和 20,但我不知道如何推导它。
您可以按照帕斯卡金字塔的概念(见图)来识别不同阶元素的基函数。

图片来自what-when-how.com。有关计算系数的详细信息,请参阅链接站点。
我之前导出了P2。P3 应该类似。
您已经知道维度,这很好。我们还需要知道节点的位置。对于 P2,我们在顶点有 4 个,在边缘有 6 个。然后剩下的就是确定插值多项式的系数。
这是一般的想法。10个单项式是 1, x, y, z, x*y, ... 等等。对于每一项我们要确定它的系数, 使得插值多项式计算给定 x、y 和 z 的确切节点位置。解决系统会给我们, 并将它们替换回,重新组合这些项将产生关于 x、y 和 z 的基础。
这是一些有助于推导的枫木代码:
restart;
with(LinearAlgebra):
# the 10 monomials
m:=[1,x,y,z,x*y,y*z,z*x,x^2,y^2,z^2];
# We are going to determine ci
q:=`+`(seq(c||i * m[i],i=1..10));
# generate node positions
node:=[<0,0,0>,<1,0,0>,<0,1,0>,<0,0,1>];
edge:=[seq(seq((node[i]+node[j])/2,j=i+1..4),i=1..4)];
all:=[op(node),op(edge)];
# Evaluate at node coordinates, and require them to be equal to node positions qi.
E:=[seq(subs(x=all[i][1],y=all[i][2],z=all[i][3],q=q||(i-1)),i=1..10)];
# Solve for coefficients ci, and substitute back to q
q:=subs(eliminate(E,[seq(c||i,i=1..10)])[1],q);
# Find the coefficient of each qi (the node position)
N:=[seq(diff(q,q||i),i=0..9)];
然后是上面代码中的 P2 基础:
> lprint(N);
[2*x^2+4*x*y+4*x*z+2*y^2+4*y*z+2*z^2-3*x-3*y-3*z+1, 2*x^2-x, 2*y^2-y, 2*z^2-z, -4*x^2-4*x*y-4*x*z+4*x, -4*x
*y-4*y^2-4*y*z+4*y, -4*x*z-4*y*z-4*z^2+4*z, 4*x*y, 4*z*x, 4*y*z]