3

定積分を含む関数をプロットしようとしています。私のコードでは、すべての無名関数を使用しています。ファイルを実行すると、エラーが発生します。私のコードは以下の通りです:

    %%% List of Parameters %%%
    gamma_sp = 1;   
    cap_gamma = 15;   
    gamma_ph = 0;   
    omega_0 = -750;   
    d_omega_0 = 400;   
    omega_inh = 100;   
    d_omega_inh = 1000;   

    %%% Formulae %%%   
    gamma_t = gamma_sp/2 + cap_gamma/2 + gamma_ph;   
    G = @(x) exp(-(x-omega_inh).^2./(2*d_omega_inh.^2))./(sqrt(2*pi)*d_omega_inh);   
    F = @(x) exp(-(x-omega_0).^2./(2*d_omega_0.^2))./(sqrt(2*pi)*d_omega_0);   
    A_integral = @(x,y) G(x)./(y - x + 1i*gamma_t);   
    Q_integral = @(x,y) F(x)./(y - x + 1i*gamma_t);   
    A = @(y) integral(@(x)A_integral(x,y),-1000,1000);   
    Q = @(y) integral(@(x)Q_integral(x,y),-3000,0);   

    P1 = @(y) -1./(1i.*(gamma_sp + cap_gamma)).*(1./(y + 2.*1i.*gamma_t)*(A(y)-conj(A(0)))-1./y.*(A(y)-A(0))+cap_gamma./gamma_sp.*Q(y).*(A(0)-conj(A(0))));   

    P2 = @(y) conj(P1(y));   
    P = @(y) P1(y) - P2(y);
    sig = @(y) abs(P(y)).^2;

    rng = -2000:0.05:1000;   
    plot(rng,sig(rng))   

プログラムが plot コマンドを実行すると、rng の各値が sig(y) に入れられ、その値が A_integral と Q_integral の y 値として使用されるように思えます。ただし、プログラムを実行しようとすると、matlab がエラーをスローします。

Error using  - 
Matrix dimensions must agree.

Error in @(x,y)G(x)./(y-x+1i*gamma_t)

Error in @(x)A_integral(x,y)

Error in integralCalc/iterateScalarValued (line 314)
            fx = FUN(t);

Error in integralCalc/vadapt (line 133)
        [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

Error in integralCalc (line 76)
    [q,errbnd] = vadapt(@AtoBInvTransform,interval);

Error in integral (line 89)
Q = integralCalc(fun,a,b,opstruct);

Error in @(y)integral(@(x)A_integral(x,y),-1000,1000)

Error in
@(y)-1./(1i.*(gamma_sp+cap_gamma)).*(1./(y+2.*1i.*gamma_t)*(A(y)-conj(A(0)))-1.    /y.*(A(y)-A(0))+cap_gamma./gamma_sp.*Q(y).*(A(0)-conj(A(0))))

Error in @(y)P1(y)-P2(y)

Error in @(y)abs(P(y)).^2

Error in fwm_spec_diff_paper_eqn (line 26)
plot(rng,sig(rng)) 

私が間違っていることについてのアイデアはありますか?

4

2 に答える 2

1

あなたが持っている

>> rng = -2000:0.05:1000;   
>> numel(rng) 
ans = 
    60001

すべての 60001 要素が渡されます

A = @(y) integral(@(x)A_integral(x,y),-1000,1000);  

呼び出す

A_integral = @(x,y) G(x)./(y - x + 1i*gamma_t);

(Q も同様)。問題はintegral、適応求積法です。つまり、x挿入される の量は、 が特定のA_integralでどのA_integralように動作するかによって (大まかに) 変化しますx

したがって、 の要素の量は、通常、 への呼び出しyの の要素とは異なります。これが失敗する理由です。xA_integraly-x +1i*gamma_t

あなたがやろうとしていることの複雑さを考えると、すべての匿名関数を適切な関数として再定義し、それらのいくつかを単一の関数に統合するのが最善だと思います。のドキュメントを調べて、(たとえば、これらの問題のいくつかをおそらく修正する代わりに)bsxfun役立つかどうかを確認してください。 bsxfun(@minus, y.', x)y-xxy

于 2012-10-15T19:57:10.337 に答える
0

ありがとうロディ、それは私には理にかなっています。私は mathematica のように matlab を使おうとし続けていますが、matlab がどのように機能するかを忘れてしまいます。コードを少し変更したところ、正しい結果が得られました。積分は非常に大まかに評価されますが、それを修正するのは簡単なはずです。修正したコードを以下に掲載しました。

%%% List of Parameters %%%
gamma_sp = 1;
cap_gamma = 15;
gamma_ph = 0;
omega_0 = -750;
d_omega_0 = 400;
omega_inh = 100;
d_omega_inh = 1000;

%%% Formulae %%%
gamma_t = gamma_sp/2 + cap_gamma/2 + gamma_ph;
G = @(x) exp(-(x-omega_inh).^2./(2*d_omega_inh.^2))./(sqrt(2*pi)*d_omega_inh);
F = @(x) exp(-(x-omega_0).^2./(2*d_omega_0.^2))./(sqrt(2*pi)*d_omega_0);
A_integral = @(x,y) G(x)./(y - x + 1i*gamma_t);
Q_integral = @(x,y) F(x)./(y - x + 1i*gamma_t);

w = -2000:0.05:1000;
sigplot = zeros(size(w));
P1plot = zeros(size(w));
P2plot = zeros(size(w));
Pplot = zeros(size(w));
aInt_range = -1000:0.1:1200;
qInt_range = -2000:0.1:100;
A_0 = sum(A_integral(aInt_range,0).*0.1);

for k=1:size(w,2)

P1plot(k) = -1./(1i*(gamma_sp + cap_gamma)).*(1./(w(k)+2.*1i.*gamma_t).*(sum(A_integral(aInt_range,w(k)).*0.1)-conj(A_0))-1./w(k).*(sum(A_integral(aInt_range,w(k)).*0.1)-A_0)+cap_gamma./gamma_sp.*sum(Q_integral(qInt_range,w(k)).*0.1).*(A_0-conj(A_0)));
P2plot(k) = conj(P1plot(k));
Pplot(k) = P1plot(k) - P2plot(k);
sigplot(k) = abs(Pplot(k)).^2;

end

plot(w,sigplot)
于 2012-10-15T22:10:48.083 に答える