2015-05-19 38 views
1

我想評估一個需要用戶定義函數集成的表達式。
我有3個輸入到積分表達式,E,F和B. F和B是存儲在單獨的數組中的值。 E是我想要整合的參數,從0到B的值。 我正在嘗試使用用戶定義函數的積分函數,儘管我不斷收到一個矩陣尺寸的錯誤,但是我沒有理解爲F,B(我認爲)的所有值都是作爲標量輸入傳遞的。集成用戶定義函數的最佳方法

但是,我意識到對於循環的每次迭代,我都定義了一個新函數,這看起來「不雅」。關於 的任何建議1.爲什麼它不會按原樣運行(即使用*的錯誤,內部矩陣尺寸必須一致) 2.任何更優雅的解決方案?

這裏是環

 for i=1:51 
       % DEFINE energy integrand, without prefixes 
       [email protected](E,F,B) sqrt(E)*exp(-8*pi*(m*q)^(0.5)*(B-E)/(3*h*F))/(exp(E/(k*Temp))+1); 
    % Integrate over energy range, store   
       J(i)=q*mu*8*pi*sqrt(2)*m.^1.5/h^3*Farray(1,i)*integral(@(E)nrgInt(E,Farray(1,i),Barray(i)),0,Barray(i)); 
       clear nrgInt 
     end 

非常感謝

回答

1

對於你的第一個問題,因爲*在Matlab代表矩陣運算部,因此,如果操作不兩邊都是標量,則既要有合適大小,即m-by-n matrix * n-by-p矩陣

對於第二個問題,你可以seperately定義函數,然後使用vertorizing而不是爲循環:

J=q*mu*8*pi*sqrt(2)*m.^1.5/h^3*Farray(1,:)*integral(@(E)nrgInt(E,Farray(1,:),Barray(:)),0,Barray(:)); 
+0

謝謝,我明白*是爲矩陣,但我認爲我只是通過它的標量。我會繼續討論你的解決方案,看起來更好,但是好奇的是,如果E,F和B是標量,爲什麼它給了我*錯誤。 – daFireman

+0

嗨,這似乎並不奏效,而且似乎與積分函數有關。如果我簡單地定義我的nrgInt並從命令行調用它,它可以正常工作,但如果我嘗試將它集成,它會給我*問題,即使我不傳遞矩陣。我如何整合我的功能? (E,F,B)sqrt(E)* exp(-8 * pi *(m * q)^(0.5)*(BE)/(3 * h * F))/(exp (E /(k * Temp))+ 1);' '積分(@(E)nrgInt(E,0.1,1),0,1) 使用* 時出現錯誤內部矩陣維度必須一致。 – daFireman

+0

Nevermind,解決方案不如我想象的那麼有趣。 Integral必須按照定義使用數組操作,我試圖通過使用*而不是。*和/來代替./來強制執行矩陣操作。 RTFM來拯救。 – daFireman

相關問題