用Matlab进行网格划分的双阵列误差

时间:2013-09-26 21:03:12

标签: 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]

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

2 个答案:

答案 0 :(得分: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)

答案 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);