2013-01-07 40 views
0

我有手柄功能隱含佔自變量

clc, clear all, close all 
tic 
k1 = 1E-02:0.1:1E+02; 
k2 = 1E-02:0.1:1E+02; 
k3 = 1E-02:0.1:1E+02; 
k = sqrt(k1.^2+k2.^2+k3.^2); 
c = 1.476; 
gamma = 3.9; 
colors = {'b'}; 
Ek = (1.453*k.^4)./((1 + k.^2).^(17/6)); 
E = @(k) (1.453*k.^4)./((1 + k.^2).^(17/6)); 
E_int = zeros(1,numel(k)); 
E_int(1) = 1.5; 

for i = 2:numel(k) 
    if k(i) < 400 
     E_int(i) = E_int(i-1) - integral(E,k(i-1),k(i)); 
    elseif k(i) > 400 
     E_int(i) = 2.180/(k(i)^(2/3)); 
    end %end if 
end %end i 


beta = (c*gamma)./(k.*sqrt(E_int)); 
figure 
plot(k,beta,colors{1}) 

count = 0; 
%F_11 = zeros(1,numel(k1)); 
F_33 = zeros(1,numel(k1)); 

之後,我應該算F_33作爲

for i = 1:numel(k1) 
    count = count + 1;  
    phi_33 = @(k2,k3) (1.453./(4.*pi)).*(((k1(i)^2+k2.^2+(k3 + beta(i).*k1(i)).^2).^2)./((k1(i)^2+k2.^2+k3.^2).^2)).*((k1(i)^2+k2.^2)./((1+k1(i)^2+k2.^2+(k3+beta(i).*k1(i)).^2).^(17/6))); 
    F_33(count) = 4*integral2(phi_33,0,1000,0,1000);  
end 

現在讓我們來我的問題。我從紙張知道:

k = sqrt(k1.^2+k2.^2+k3.^2); 
k30 = k3 + beta.*k1; 
k0 = sqrt(k1.^2+k2.^2+k30.^2); 
E_k0 = 1.453.*(k0.^4./((1+k0.^2).^(17/6))); 

因此,對於phi_33表達會導致

phi_33 = (E_k0./(4*pi.*(k.^4))).*(k1.^2+k2.^2); 

的問題是:我怎麼能利用這最後的表達insted的長一個我的目前使用(在for循環中)?

phi_33的最後一個表達式更容易處理(特別是因爲在編寫前者時魯莽的錯誤)並且它會「通過引用」(k2,k3),這是獨立變量。

任何暗示都是值得歡迎的。

最好的問候, FPE

+3

如果你能提煉出你所問的內容的真相,那麼這個問題將更具可讀性。我不明白,如果你只是想矢量化你的代碼? – bla

+0

'E_int(400)'的值是多少? – Shai

+0

@natan我不想矢量化。我希望for循環中的句柄函數使用phi_33的最後一個表達式,而不是我目前使用的擴展表達式。 – fpe

回答

1

如果我理解正確,你要使用新的表達完全相同的方式與舊班輪。由於可讀性的原因,您只需將功能phi33分成幾部分即可。

你可以通過將表達式放在一個單獨的函數中來獲取計算所需的所有值。使用舊的表達準確,這將是這個樣子:

function phi_33 = phi_33_old(k1,k2,k3,beta,i) 

phi_33 = (1.453./(4.*pi)).*(((k1(i)^2+k2.^2+(k3 + beta(i).*k1(i)).^2).^2)./((k1(i)^2+k2.^2+k3.^2).^2)).*((k1(i)^2+k2.^2)./((1+k1(i)^2+k2.^2+(k3+beta(i).*k1(i)).^2).^(17/6))); 

end 

該功能可隨後在裏面的for循環這樣叫。

phi_33_test = @(k2,k3) phi_33_old(k1,k2,k3,beta,i); 

使用相同的樣式,可以定義一個新的函數如下。在這裏的所有phi_33值被計算,然後將第i值被選擇

function phi_33 = phi_33_new(k1,k2,k3,beta,i) 

k = sqrt(k1.^2+k2.^2+k3.^2); 
k30 = k3 + beta.*k1; 
k0 = sqrt(k1.^2+k2.^2+k30.^2); 
E_k0 = 1.453.*(k0.^4./((1+k0.^2).^(17/6))); 
phi_33_allValues = (E_k0./(4*pi.*(k.^4))).*(k1.^2+k2.^2); 
phi_33 = phi_33_allValues(i); 

end 

注。它的寫法只是爲了顯示與舊案件的相似性。這個新函數現在可以在for循環中以與舊的相同的方式調用。

phi_33 = @(k2,k3) phi_33_new(k1,k2,k3,beta,i); 
+0

這個提示應該是我正在尋找的東西。我會努力的。非常感謝 – fpe

+0

我通過使用phi_33_new函數來匹配我需要匹配的結果的方法編輯了您的答案。有用 – fpe