我有那个
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
答案 0 :(得分: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
的所有值,然后选择i
值。它以这种方式编写,只是为了显示与旧案例的相似性。这个新函数现在可以在for循环中以与旧循环相同的方式调用。
phi_33 = @(k2,k3) phi_33_new(k1,k2,k3,beta,i);