Arrays 用Matlab实现啮合中的双阵列误差
我有一个0.1弧度的网格Arrays 用Matlab实现啮合中的双阵列误差,arrays,matlab,mesh,Arrays,Matlab,Mesh,我有一个0.1弧度的网格 mesh = makeSlitMesh(0.1,5) 其内容 p: [2x188 double] t: [3x330 double] edges: [2x517 double] t2e: [3x330 double] e2t: [2x517 double] 在xy处获取解决方案功能的我的参数: >> x = randn(100,1); >> y = randn(100,1);
mesh = makeSlitMesh(0.1,5)
其内容
p: [2x188 double]
t: [3x330 double]
edges: [2x517 double]
t2e: [3x330 double]
e2t: [2x517 double]
在xy处获取解决方案功能的我的参数:
>> x = randn(100,1);
>> y = randn(100,1);
我运行下面的函数代码
在xy(@(x,y)sin(pi*x)。*sin(pi*y),mesh,x,y)处获得解
并获取错误
Error using TriScatteredInterp
Sample values must be a double array.
Error in get_solution_at_xy (line 18)
F=TriScatteredInterp(mesh.p(1,:)',mesh.p(2,:)',uh);
我已经转置了数组x和y,但仍然得到相同的错误。
数组是双数组
什么会导致此错误?
在xy函数处获取解决方案
% Evaluates the FEM function "uh" defined on "mesh" at the points x,y
%
% CALLING SYNTAX IS
%
% function val = get_solution_at_xy(uh,mesh,x,y)
%
% uh = FEM function to be evaluated
% mesh = trimesh structure on which the FEM function is defined
% x = x coordinates of the evaluation points
% y = y coordinates of the evaluation points
%
% val = value of the FEM function evaluated at the points x,y
%
function val = get_solution_at_xy(uh,mesh,x,y)
F=TriScatteredInterp(mesh.p(1,:)',mesh.p(2,:)',uh);
val=F(x,y);
end
来自TriScatteredInterp
的错误消息中的“样本值”指的是变量uh
,而不是x
和y
,正如您所指出的,它们是双数组
但是,使用uh
将函数句柄作为样本传递给TriScatteredInterp
。您需要:
中获取xy.m处的\u溶液]
评估网格点处的uh
uhvals=uh(mesh.p(1,:)',mesh.p(2,:))代码>
F=TriScatteredInterp(mesh.p(1,:)',mesh.p(2,:)',uhvals)代码>
uhvals=sin(pi*mesh.p(1,:))*sin(pi*mesh.p(2,:))代码>
在xy(uhvals,mesh,x,y)处获取解决方案
TriScatteredInterp
的错误消息中的“样本值”指的是变量uh
,而不是x
和y
,正如您所指出的,它们是双数组
但是,使用uh
将函数句柄作为样本传递给TriScatteredInterp
。您需要:
中获取xy.m处的\u溶液]
评估网格点处的uh
uhvals=uh(mesh.p(1,:)',mesh.p(2,:))代码>
F=TriScatteredInterp(mesh.p(1,:)',mesh.p(2,:)',uhvals)代码>
uhvals=sin(pi*mesh.p(1,:))*sin(pi*mesh.p(2,:))代码>
在xy(uhvals,mesh,x,y)处获取解决方案
它抱怨的原因是函数TriScatteredInterp不接受函数,而是在第三个参数中需要一个双数组。这将解决您的问题,而无需更改功能代码
x = randn(100,1);
y = randn(100,1);
get_solution_at_xy(sin(pi*mesh.p(1,:)).*sin(pi*mesh.p(2,:)), mesh, x, y);
它抱怨的原因是函数TriScatteredInterp不接受函数,而是在第三个参数中需要一个双数组。这将解决您的问题,而无需更改功能代码
x = randn(100,1);
y = randn(100,1);
get_solution_at_xy(sin(pi*mesh.p(1,:)).*sin(pi*mesh.p(2,:)), mesh, x, y);
在匿名函数中使用(x,y)
是不幸的,因为它使代码的意图不那么清楚,我相信您的代码与此不太一致。函数get\u solution\u at_xy
为指定位置的给定样本构建插值F
。然后在不同的位置对插入剂进行评估(val=F(x,y)
)。因此,使用x
和y
构建interplant没有多大意义。它可能是网格,这里的匿名函数增加了混乱。我已经澄清了我的解决方案,以便更好地显示意图。在匿名函数中使用(x,y)
是不幸的,因为它使代码的意图不那么清晰,我相信您的代码与此不太一致。函数get\u solution\u at_xy
为指定位置的给定样本构建插值F
。然后在不同的位置对插入剂进行评估(val=F(x,y)
)。因此,使用x
和y
构建interplant没有多大意义。它可能是网格,这里的匿名函数增加了混乱。我已经澄清了我的解决方案,以便更好地显示意图。