如何调用多个依赖函数?

How to call multiple dependent functions?

我想在代码中像这样调用多个依赖函数。

function  [k11,k12] = k_fun()
% syntax is : function [outputs] = function-name(inputs)
  a=2.0;
  k11 = quad(B1,B1,a); %error
% For k11,  I want to call function b_fun and select only B1,B2 to pass to function quad.
  k12 = quad(B1,B2,a);
 endfunction

 function  [B] = b_fun(x)
  B1 = -0.5+x;
  B2 = 2.0*x;
  B3 = 0.5+x;
  B=[B1,B2,B3];
  endfunction


 function  [value] = quad(B_i,B_j,a)
   value=0
   points = [0.57,-0.57];
   wt=[1.0,1.0]
   for (ct=1:1:2)
    value = value + (B_i(points(ct))*B_j(points(ct))*a)*wt(ct);
   end
 endfunction

我想要 运行 函数 k_fun。 a=2.0 后会转到 k11 行。对于 k11,我想从 b_fun() 中获取 B1B2,并将其传递给 quad()。在 quad() 中,函数将被计算。

我正在努力 k12 = B1(0.57)*B2(0.57)*a*1 + B1(-0.57)*B2(-0.57)*a*1。这些值 +-0.57 出现在函数 quad 中。我不知道如何在行 %error 中传递 B1B2。我陷入了调用依赖函数的困境。我非常想保留相同的程序格式(在各个函数中定义的变量),因为原始程序是这样的。后来,我想把这个程序翻译成C++,所以想使用编程语言的标准函数而不是特定的函数。

顺便说一下,我在 Octave 中启动程序,所以在 MATLAB 中 endfunction 而不是 end

你最好的选择是稍微重组一下,这样每个 B* 变量都有一个单独的 b_fun 版本。然后,您可以为这些 b_fun 创建一个函数句柄,并将 that 传递给 quad.

function [k11, k12] = k_fun()
    a = 2.0;
    k11 = quad(@b1_fun, @b1_fun, a);
    k12 = quad(@b1_fun, @b2_fun, a);
end

function result = b1_fun(x)
    result = x - 0.5;
end

function result = b2_fun(x)
    result = 2 * x;
end

或者,您可以只创建 B1B2 匿名函数,因为它们非常简单

function [k11, k12] = k_fun()
    a = 2.0;

    B1 = @(x)x - 0.5;
    B2 = @(x) 2 * x;

    k11 = quad(B1, B1, a);
    k12 = quad(B1, B2, a);
end

这是另一种方法:

B = @(x) [-0.5 + x ; 
          2.0 .* x ;
          0.5 +  x ];

现在您可以将行向量传递给 B 并获得一列输出!所以

points = [0.57,-0.57];

B(points) =
    0.0700   -1.0700
    1.1400   -1.1400
    1.0700   -0.0700

然后你说你想实际计算:

k12 = B1(0.57)*B2(0.57)*a*1 + B1(-0.57)*B2(-0.57)*a*1

在这个新结构下,

k12 = B(1,1)*B(2,1)*a*1 + B(1,2)*B(2,2)*a*1

我不确定您为什么将 *1 留在其中,但为了完整起见,我保留了它们。总之,你只需要一个B_output = B(points)变量,B2现在通过B_output(2,i)访问,其中i是对应points的列索引指数。如果你只过了B(x)一分,你可以说B2 = B_output(2)

总结一下

你的整个代码可以写成:

a = 2.0;
B = @(x) [-0.5 + x ; 
          2.0 .* x ;
          0.5 +  x ];

k11 = quad(B, 1, 1, a);
k12 = quad(B, 1, 2, a);

function value = quad(B, i, j, a)

    value = 0;
    points = [0.57,-0.57];
    wt = [1.0,1.0];

    B_output = B(points);

    for ct = 1:2

        value = value + B_output(i, ct)*B_output(j, ct)*a*wt(ct);

    end

end