[未答复] for循环内套用solve函数,导致求解速度巨慢,希望得到指点

[复制链接]
xmzdls 发表于 2021-9-15 16:32:04
我最近读了篇文献,想复现论文的算法,尝试写了一段程序。在我的程序里存在for循环里套用solve函数求解高次方程组,程序运行了2天没有运行完,我就把程序停了,从运行情况来看是有结果的。想到可能的原因就是solve函数求解的是高次方程组,本身就慢,再加上for循环就更慢了。但是自己一直没有找到合适的解决方案,所以来论坛求助大家了,程序如下:
close all
clc,clear;
U=110000;
R=6.8;
L=0.001;
N=1638;
f=50;
t=linspace(0,1/f,100);
u1=sqrt(2)*U*cos(2*pi*f*t);
u2=sqrt(2)*U*cos(2*pi*f*t-2*pi/3);
u3=sqrt(2)*U*cos(2*pi*f*t+2*pi/3);
K1=1.5;
K2=0.03;
p=5;
fm0=1;
l1=2;
l2=1;
l3=l1;
S=0.1066464;
dB_dH_1=@(H)K1*(1+(H/fm0)^p)^(-1/p)+K1*H*(-1/p*(1+(H/fm0)^p)^(-(1+p)/p)*p*(H/fm0)^(p-1)*1/fm0)+K2;
dB_dH_2=@(H)K1*(1+(-H/fm0)^p)^(-1/p)+K1*H*(-1/p*(1+(-H/fm0)^p)^(-(1+p)/p)*p*(-H/fm0)^(p-1)*(-1/fm0))+K2;
dt=1/f/99;
i1out=zeros(length(t),1);
i2out=zeros(length(t),1);
i3out=zeros(length(t),1);
for jj=1:1:length(t)
i10=u1(jj)/3889087;
i20=u2(jj)/3889087;
i30=u3(jj)/3889087;
for ii=1:1:10000
syms H10 H20 H30
[H10,H20,H30]=solve(H10*l1-H20*l2==N*(i10-i20),H30*l3-H20*l2==N*(i30-i20),K1*H10*(1+(abs(H10/fm0))^p)^(-1/p)+K2*H10+K1*H20*(1+(abs(H20/fm0))^p)^(-1/p)+K2*H20+K1*H30*(1+(abs(H30/fm0))^p)^(-1/p)+K2*H30==0,H10,H20,H30);
H10v=double(H10);
H20v=double(H20);
H30v=double(H30);
if H10v>=0
g_H10=dB_dH_1(H10v);
else
g_H10=dB_dH_2(H10v);
end
if H20v>=0
g_H20=dB_dH_1(H20v);
else
g_H20=dB_dH_2(H20v);   
end
if H30v>=0
g_H30=dB_dH_1(H30v);
else
g_H30=dB_dH_2(H30v);   
end
F=l2/l1*g_H10+g_H20+l2/l3*g_H30;
b=[u1(jj)-R*i10;u2(jj)-R*i20;u3(jj)-R*i30];
K11=L+N*S*g_H10*(N/l1-N*l2/l1^2*g_H10/F);
K12=N*S*g_H10*N*l2/l1^2*(g_H10+g_H30)/F-N/l1;
K13=N*S*g_H10*(-N*l2/l1^2)*g_H30/F;
K21=N*S*g_H20*(N/l1*g_H10/F);
K22=L+N*S*g_H20*(N/l1*(g_H10+g_H30)/F);
K23=N*S*g_H20*(-N/l1)*g_H30/F;
K31=N*S*g_H30*(-N*l2/l1^2*g_H10/F);
K32=N*S*g_H30*N*l2/l1^2*(g_H10+g_H30)/F-N/l1;
K33=L+N*S*g_H30*(N/l1-N*l2/l1^2)*g_H30/F;
K=[K11 K12 K13;K21 K22 K23;K31 K32 K33];
di_dt=inv(K)*b;
di=di_dt*dt;
i1=i10+di(1);
i2=i20+di(2);
i3=i30+di(3);
if abs(i1-i10)/i10<0.01&&abs(i2-i20)/i20<0.01&&abs(i3-i30)/i30<0.01
    i1out(jj)=i1;
    i2out(jj)=i2;
    i3out(jj)=i3;
else
    i10=i1;
    i20=i2;
    i30=i3;
end
end
end


3 条回复


xmzdls 发表于 2021-9-16 21:20:23
又思考了一天,还是没法解决:Q:Q:Q,有人帮助我吗?

xmzdls 发表于 2021-9-16 21:36:30
我突然有个想法,那就是:既然solve函数求解高次方程组是导致速度慢的原因,那我能不能用其它函数代替第3个高次方程,比如说我通过CFTL拟合一组离散数据代替那个高次方程。但是我不能确定solve函数能不能对cfit格式进行计算。有没有人了解这方面的?

xmzdls 发表于 2021-9-17 11:06:27
我自己发现问题了,那就是在判断收敛那部分,存储结果到i1out,i2out,i3out时,得加上break语句跳出当前循环
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表