2

我有一个 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), 网格, 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);

我已经转置了数组xy,但仍然得到同样的错误。数组是双的。

什么会导致此错误?

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
4

2 回答 2

3

错误消息中的“样本值”TriScatteredInterp指的是变量uh,而不是xy,正如您所指出的,它们是双数组。

但是,uh您将函数句柄作为样本传递给TriScatteredInterp. 您需要:

  1. [在get_solution_at_xy.m]uh在您的网格点进行评估。

    uhvals = uh(mesh.p(1,:)',mesh.p(2,:)'); F=TriScatteredInterp(mesh.p(1,:)',mesh.p(2,:)',uhvals);

  2. [在调用者中]忘记匿名函数并输入计算值而不是公式。

    uhvals = sin(pi*mesh.p(1,:)').*sin(pi*mesh.p(2,:)'); get_solution_at_xy(uhvals, mesh, x, y)

于 2013-09-26T21:17:57.593 回答
1

它抱怨的原因是因为函数 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);
于 2013-09-27T00:43:59.303 回答