Arrays 用Matlab实现啮合中的双阵列误差

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

我有一个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);
我运行下面的函数代码

在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);
我已经转置了数组xy,但仍然得到相同的错误。 数组是双数组

什么会导致此错误?

在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没有多大意义。它可能是网格,这里的匿名函数增加了混乱。我已经澄清了我的解决方案,以便更好地显示意图。