【问题标题】:Best way to integrate user defined function集成用户定义功能的最佳方式
【发布时间】:2015-05-19 17:36:54
【问题描述】:

我想计算一个需要用户定义函数积分的表达式。
我有 3 个积分表达式的输入,E、F 和 B。F 和 B 是存储在单独数组中的值。 E 是我要积分的参数,从 0 值到 B 值。 我正在尝试将积分函数与用户定义的函数一起使用,尽管我不断收到矩阵维度错误,我不理解这是因为 F、B 的所有值(我认为)都作为标量输入传递。

但是,我意识到对于循环的每次迭代,我都在定义一个新函数,这似乎“不优雅”。任何建议 1.为什么它不会按原样运行(即使用*的错误,内矩阵尺寸必须一致) 2. 还有更优雅的解决方案吗?

这是循环

     for i=1:51
               % DEFINE energy integrand, without prefixes
               nrgInt=@(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

非常感谢

【问题讨论】:

    标签: matlab integral


    【解决方案1】:

    对于你的第一个问题,因为*在Matlab中代表矩阵运算符,所以如果运算的两边不是标量,那么两者都必须有适当的大小,即m-by-n matrix * n-by-p矩阵

    对于第二个问题,你可以单独定义函数,然后使用vertorizing而不是for-loop:

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

    【讨论】:

    • 谢谢,我知道 * 是一个矩阵,但我以为我只传递了标量。我会继续你的解决方案,看起来更好,但我很好奇如果 E、F 和 B 是标量,为什么它会给我 * 错误。
    • 你好,这似乎不起作用,它似乎与积分函数有关。如果我简单地定义我的 nrgInt 并从命令行调用它,它工作正常,但如果我尝试集成它,它会给我 * 问题,即使我没有传递矩阵。如何集成我的功能? nrgInt = @(E,F,B) sqrt(E)*exp(-8*pi*(m*q)^(0.5)*(B-E)/(3*h*F))/(exp(E/(k*Temp))+1);integral(@(E)nrgInt(E,0.1,1),0,1) Error using * Inner matrix dimensions must agree.
    • 没关系,解决方案没有我想象的那么有趣。积分必须根据定义使用数组运算,我试图通过使用 * 而不是 .* 和 / 而不是 ./ 来强制矩阵运算。 RTFM 来救援。
    猜你喜欢
    • 2019-08-29
    • 2010-10-07
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多