我对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不起作用。