2017-01-16 12 views
2

私はこのような複数の依存関数をコード内で呼び出す必要があります。複数の従属関数を呼び出す方法は?

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については、B1B2b_fun()から、quad()に渡します。 では、関数が評価されます。

私は何をしようとしています k12 = B1(0.57)*B2(0.57)*a*1 + B1(-0.57)*B2(-0.57)*a*1これらの値、±0.57は、関数quadに入っています。私はどのようにB1B2%errorの行に渡すのか分からない。私は依存する関数を呼び出すことに悩まされています。私は、元のプログラムがこのようになっているので、同じプログラムフォーマット(それぞれの関数で定義された変数)を維持したいと思っています。後でこのプログラムをC++に翻訳したいので、特定のプログラミング言語の代わりにプログラミング言語の標準機能を使用したいと考えています。

ところで、私はOctaveでプログラムを開始しました。だから、endfunctionの代わりにendがMATLABにあります。

答えて

0

とても単純明快なので、あなただけのここにもう一つの方法だB1B2無名関数を作成することができます。

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

今あなたがBに行ベクトルを渡すことができますが、出力の列を取得!この新体制の下で

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

なり、

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

をあなたが残してきた理由は、私はよく分からない:だから

points = [0.57,-0.57]; 

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

次に、あなたが実際に計算したいと言います*1が入りましたが、私はそれらを完全に保ってきました。要約すると、B_output = B(points)という変数が1つだけ必要です。はB_output(2,i)でアクセスされます。iは、pointsのインデックスに対応する列インデックスです。 B(x)一点しか渡さなかった場合、B2 = B_output(2)と言うことができます!

あなたの全体のコードを書くことができます要約すると

: `B = b_fun()`)(b_fun `とは`引数に取るようにコードの

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 
1

B*変数ごとに別々のバージョンのb_funがあるように、ちょっとした再編成が最善の策です。これらの関数ハンドルを作成してのものにし、から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 

代わりに、彼らは

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 
+0

3行目は、問題と思われます。しかし、この引数は 'quad()'に渡されます。 – user7423098

+0

@ user7423098申し訳ありませんが、気付かなかった。オプションで更新。 – Suever

関連する問題