我有一个0.1弧度切口的网格。
mesh = makeSlitMesh(0.1,5)
其内容
p: [2x188 double]
t: [3x330 double]
edges: [2x517 double]
t2e: [3x330 double]
e2t: [2x517 double]
get_solution_at_xy 功能的参数:
>> x = randn(100,1);
>> y = randn(100,1);
我运行代码在
之下的函数get_solution_at_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 ,但仍会出现相同的错误。 阵列是双倍的。
导致此错误的原因是什么?
get_solution_at_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
答案 0 :(得分:3)
来自TriScatteredInterp
的错误消息中的“示例值”是指变量uh
,而不是x
和y
,它们是您指出的双数组。
但是,对于uh
,您将函数句柄作为样本传递给TriScatteredInterp
。你需要:
[在get_solution_at_xy.m
] 评估网格点的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,:)');
get_solution_at_xy(uhvals, mesh, x, y)
答案 1 :(得分:1)
它抱怨的原因是因为TriScatteredInterp函数不接受函数,而是在第三个参数中需要一个double数组。这应该可以解决您的问题,而无需更改功能代码。
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);