2015-05-19 60 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

相关问题