使用solve而不是vpasolve来加速Matlab中的计算?

时间:2014-12-10 11:56:58

标签: matlab numeric

我对Matlab比较陌生。目前我正在使用vpasolve解决方程式。由于这需要循环80多个变量,因此速度很慢。

% input variables
% ffsample = Fourier transformed reference waveform
% ffref = Fourier transformed reference waveform

len=80;
n1=1;
n2=1.95;
alpha_grad=30;
beta_grad=14.858;

% constants
tp12=2.*n1.*cos(alpha)./(n2.*cos(alpha)+n1.*cos(beta));
tp21=2.*n2.*cos(beta)./(n1.*cos(beta)+n2.*cos(alpha));

%functions with unknown n3
syms n3
gamma= asin(n2.*sin(beta)./n3);
rp23 = (n3 .* cos(beta) - n2.*cos(gamma)) ./ (n3 .* cos(beta) + n2 .* cos(gamma));

t = cputime;
res_para=zeros(len,1);

%loop to solve for n3
digits(5):
for i=1:len
    res_para(i)=vpasolve(ffsample(i)./ffref(i) == (tp12*tp21*rp23) ./ (tp12*tp21), n3);
end

e = cputime-t

%convert results to complex numbers
res_para=double(res_para);
res_para=squeeze(res_para);
res_para=res_para';

现在,我试图将其转换为在进入循环之前使用solve的等式。据我了解,我应该结合vpa使用solve?目前我正在尝试以下代码,但它不会启动:

res_p=solve(x == (tp12*tp21*rp23) ./ (tp12*tp21), n3);

t = cputime;
res_para=zeros(len,1);

for i=1:len

    x=ffsample(i)./ffref(i);
    res_para=vpa(res_p(x));
end

非常感谢任何帮助。

更新

感谢您的回复。我改变了数字(5)的位置。 是的,数字(5)确实是一个非常低的值,然而,它在代码上方加速了大约3倍。

正如我所说的,我对matlab相对较新,并认为先用符号来解决方程然后插入变量会大大减少时间,但也许我错了。

考虑到我使用vpasolve以数字方式解决一个非常简单的等式:

function [ xval ] = example(  )
syms x
for y=1:10
    xval(y) = vpasolve(y == 5.*x+6, x);
end

如果我先解决x的函数y = 5x + 6,然后在循环中只包含msising值,那会不会更快?像这样:

function [ xval ] = example2(  )
syms x
% symbolic solve for x (???)
% y=5x+6 ==> x=(y-6)/5
sol=solve( y == 5.*x+6, x)

for y=1:10
    xval(y) = sol(y);
end

显然,example2不起作用。

0 个答案:

没有答案