MATLAB中的积分函数

MATLAB中的积分函数,matlab,integration,Matlab,Integration,我对Matlab是新手。我想集成一个函数。我尝试了int()和integrate(),但它们都会给我带来问题——没有足够的参数或其他不同的错误,我尝试了许多与文档的组合。我当前的代码如下,我希望能够将数字p和q传递给res,并获得一个数值结果: syms x; w = 1; hbar = 1.054571800*10^(-34); k = (w/(pi*hbar))^(1/4); e = @(q) (w*q/hbar)^(1/2); waveF = @(q) k*exp(-feval(e,q)*

我对Matlab是新手。我想集成一个函数。我尝试了int()和integrate(),但它们都会给我带来问题——没有足够的参数或其他不同的错误,我尝试了许多与文档的组合。我当前的代码如下,我希望能够将数字p和q传递给res,并获得一个数值结果:

syms x;
w = 1;
hbar = 1.054571800*10^(-34);
k = (w/(pi*hbar))^(1/4);
e = @(q) (w*q/hbar)^(1/2);
waveF = @(q) k*exp(-feval(e,q)*feval(e,q)*1/2.0)*1.0/1;
func = @(p,q) waveF(q-x/2)*waveF(q+x/2)*exp(1i*p*x/(hbar));

res = @(p,q) int(func(p,q), x = -Inf..Inf);
目前,“x=”表示为en error,但根据文档,它似乎正常

谢谢。

您正在与配合使用,并且错误地使用了的版本,当您需要时,该版本实际上产生了错误

虽然将匿名函数与符号调用相混合并不违法,但我认为,每次坚持一种计算范式会更好:

  • 使用符号函数的纯符号版本:

    syms x p q e(q) waveF(q) func(p,q) res(p,q);
    w         = sym(1);
    hbar      = sym('1.054571800E-34');
    k         = (w/(pi*hbar))^(1/4);
    e(q)      = sqrt(w*q/hbar);
    waveF(q)  = k*exp(-e(q)^2/2);
    func(p,q) = waveF(q-x/2)*waveF(q+x/2)*exp(1i*p*x/(hbar));
    res(p,q)  = int(func(p,q),x,-Inf,Inf);
    
    我将
    hbar
    的值用引号括起来,以强制使用提供的值,而不是在计算过程中强制使用的最接近的有理表达式


  • 使用匿名函数和数字函数的纯数字版本:

    w     = 1;
    hbar  = 1.054571800E-34;
    k     = (w/(pi*hbar)).^(1/4);
    e     = @(q) sqrt(w*q/hbar);
    waveF = @(q) k*exp(-e(q).^2/2);
    func  = @(p,q,x) waveF(q-x/2).*waveF(q+x/2).*exp(1i*p*x/hbar);
    res   = @(p,q) integral(@(x) func(p,q,x),-Inf,Inf);
    

  • 当计算
    res
    时,这两个版本都会生成
    NaN
    ,但这可能是被积函数的一个缺点。但是,上述脚本背后的函数形式和思想不会随着被积函数的不同而改变。

    您与的配合使用,并且错误地使用了的版本,而当您需要时,该版本实际上产生了错误

    虽然将匿名函数与符号调用相混合并不违法,但我认为,每次坚持一种计算范式会更好:

  • 使用符号函数的纯符号版本:

    syms x p q e(q) waveF(q) func(p,q) res(p,q);
    w         = sym(1);
    hbar      = sym('1.054571800E-34');
    k         = (w/(pi*hbar))^(1/4);
    e(q)      = sqrt(w*q/hbar);
    waveF(q)  = k*exp(-e(q)^2/2);
    func(p,q) = waveF(q-x/2)*waveF(q+x/2)*exp(1i*p*x/(hbar));
    res(p,q)  = int(func(p,q),x,-Inf,Inf);
    
    我将
    hbar
    的值用引号括起来,以强制使用提供的值,而不是在计算过程中强制使用的最接近的有理表达式


  • 使用匿名函数和数字函数的纯数字版本:

    w     = 1;
    hbar  = 1.054571800E-34;
    k     = (w/(pi*hbar)).^(1/4);
    e     = @(q) sqrt(w*q/hbar);
    waveF = @(q) k*exp(-e(q).^2/2);
    func  = @(p,q,x) waveF(q-x/2).*waveF(q+x/2).*exp(1i*p*x/hbar);
    res   = @(p,q) integral(@(x) func(p,q,x),-Inf,Inf);
    

  • 当计算
    res
    时,这两个版本都会生成
    NaN
    ,但这可能是被积函数的一个缺点。然而,上述脚本背后的函数形式和思想不会随着被积函数的不同而改变