2017-01-16 5 views
2

Ich möchte mehrere abhängige Funktionen wie diese im Code aufrufen.Wie mehrere abhängige Funktionen aufrufen?

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 

Ich möchte Funktion k_fun ausführen. Nach a=2.0 Es wird zu k11 Zeile gehen. Für k11 möchte ich B1 und B2 von b_fun() erhalten, übergeben Sie es an quad(). In quad() werden die Funktionen ausgewertet.

Ich versuche k12 = B1(0.57)*B2(0.57)*a*1 + B1(-0.57)*B2(-0.57)*a*1 zu tun. Diese Werte, + -0,57, kommen in der Funktion quad. Ich bekomme nicht, wie man B1 und B2 in der Linie %error übergibt. Ich stehe beim Aufruf abhängiger Funktionen fest. Ich möchte das gleiche Programmformat (Variablen, die in den jeweiligen Funktionen definiert sind) beibehalten, weil das ursprüngliche Programm so läuft. Später möchte ich dieses Programm in C++ übersetzen, also möchte ich Standardfunktionen von Programmiersprachen anstelle von bestimmten verwenden.

Übrigens habe ich das Programm in Octave gestartet, also endfunction statt end in MATLAB.

Antwort

0

Hier ist eine andere Methode ist:

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

Jetzt können Sie einen Zeilenvektor zu B passieren und eine Spalte mit Ausgaben bekommen! So

points = [0.57,-0.57]; 

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

Dann sagen Sie möchten, berechnen tatsächlich:

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

, die unter dieser neuen Struktur wäre

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

Ich bin mir nicht sicher, warum Sie die verlassen haben *1 s in, aber ich habe sie für die Vollständigkeit gehalten. Zusammenfassend müssen Sie nur eine B_output = B(points) Variable haben, und B2 wird jetzt über B_output(2,i) erreicht, wobei i der Spaltenindex ist, der dem points Index entspricht. Wenn Sie nur B(x) einen Punkt überschritten haben, könnten Sie sagen: B2 = B_output(2)!

Um

Ihre gesamte Code zusammenfassen geschrieben werden könnte:

scheint, als `B = b_fun()` als `b_fun()` nimmt Argument problematisch
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

Ihre beste Wette wird sein, ein wenig zu reorganisieren, so dass Sie eine separate Version von b_fun für jede B* Variable haben. Sie können dann eine Funktionskennung für diese b_fun erstellen und diese zu quad übergeben.

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 

Alternativ können Sie nur B1 und B2 anonyme Funktionen erstellen, da sie so einfach sind

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

Dritte Zeile des Codes.Dieses Argument wird jedoch durch 'quad()' übergeben. – user7423098

+0

@ user7423098 Oh sorry, habe das nicht bemerkt. Mit einer Option aktualisiert. – Suever

Verwandte Themen