0

私は持っています

clc, clear all, close all
tic
k1 =  1E-02:0.1:1E+02;
k2 =  1E-02:0.1:1E+02;
k3 =  1E-02:0.1:1E+02;
k = sqrt(k1.^2+k2.^2+k3.^2);
c = 1.476;
gamma = 3.9;
colors = {'b'};
Ek = (1.453*k.^4)./((1 + k.^2).^(17/6));
E = @(k) (1.453*k.^4)./((1 + k.^2).^(17/6));
E_int = zeros(1,numel(k));
E_int(1) = 1.5;

for i = 2:numel(k)
    if k(i) < 400
        E_int(i) = E_int(i-1) - integral(E,k(i-1),k(i));
    elseif k(i) > 400
        E_int(i) = 2.180/(k(i)^(2/3));
    end %end if
end %end i


beta = (c*gamma)./(k.*sqrt(E_int));
figure
plot(k,beta,colors{1})

count = 0;
%F_11 = zeros(1,numel(k1));
F_33 = zeros(1,numel(k1));

その後、F_33を次のように計算する必要があります

for i = 1:numel(k1)   
    count = count + 1;    
    phi_33 = @(k2,k3) (1.453./(4.*pi)).*(((k1(i)^2+k2.^2+(k3 + beta(i).*k1(i)).^2).^2)./((k1(i)^2+k2.^2+k3.^2).^2)).*((k1(i)^2+k2.^2)./((1+k1(i)^2+k2.^2+(k3+beta(i).*k1(i)).^2).^(17/6)));
    F_33(count) = 4*integral2(phi_33,0,1000,0,1000);    
end

さて、私の質問に行きましょう。私は論文から次のことを知っています:

k = sqrt(k1.^2+k2.^2+k3.^2);
k30 = k3 + beta.*k1;
k0 = sqrt(k1.^2+k2.^2+k30.^2);
E_k0 = 1.453.*(k0.^4./((1+k0.^2).^(17/6)));

したがって、phi_33の式は次のようになります。

phi_33 = (E_k0./(4*pi.*(k.^4))).*(k1.^2+k2.^2);

問題は、現在(forループ内で)使用している長い式を挿入したこの最終式をどのように利用できるかということです。

phi_33の最後の式は、処理が簡単で(特に、前者の記述における無謀な間違いのため)、独立変数である「参照渡し」(k2、k3)になります。

どんなヒントも大歓迎です。

よろしく、fpe

4

1 に答える 1

1

私があなたを正しく理解しているなら、あなたは古いワンライナーとまったく同じ方法で新しい式を使いたいと思うでしょう。phi33読みやすさのために、関数をパーツに分割したいだけです。

これを行うには、計算に必要なすべての値を取得する別の関数に式を配置します。古い式を正確に使用すると、次のようになります。

function phi_33 = phi_33_old(k1,k2,k3,beta,i)

phi_33 = (1.453./(4.*pi)).*(((k1(i)^2+k2.^2+(k3 + beta(i).*k1(i)).^2).^2)./((k1(i)^2+k2.^2+k3.^2).^2)).*((k1(i)^2+k2.^2)./((1+k1(i)^2+k2.^2+(k3+beta(i).*k1(i)).^2).^(17/6)));

end

この関数は、このようにforループ内で呼び出すことができます。

phi_33_test = @(k2,k3) phi_33_old(k1,k2,k3,beta,i);

同じスタイルを使用して、新しい関数を次のように定義できます。

function phi_33 = phi_33_new(k1,k2,k3,beta,i)

k = sqrt(k1.^2+k2.^2+k3.^2);
k30 = k3 + beta.*k1;
k0 = sqrt(k1.^2+k2.^2+k30.^2);
E_k0 = 1.453.*(k0.^4./((1+k0.^2).^(17/6)));
phi_33_allValues = (E_k0./(4*pi.*(k.^4))).*(k1.^2+k2.^2);
phi_33 = phi_33_allValues(i);

end

ここでは、のすべての値phi_33が計算されてから、ithの値が選択されていることに注意してください。このように書かれているのは、古いケースとの類似性を示すためだけです。この新しい関数は、古い関数と同じ方法でforループ内で呼び出すことができます。

phi_33 = @(k2,k3) phi_33_new(k1,k2,k3,beta,i);
于 2013-01-07T10:28:02.760 に答える