%Gauss_seidel迭代法:Gau_Seid.m
%x为迭代解,sp为迭代次数,a为系数矩阵,b为常数矩阵,ep为误差精度,V1为初始变量
function [V,sp]=Gau_Seid(a,b,ep,V1)
%系数矩阵维数
n=length(a);
%误差
e=ones(n,1);
%迭代的解向量
V2=zeros(n,1);
%迭代的次数
k=0;
%电路常量与初值
KB=1.38e-23;
q=1.602e-19;
T=300;
G=1;
IS=1;
%热电势
Vt=q/(KB*T);
%当误差没有满足要求时继续迭代
while norm(e,2)>ep
str=sprintf('V%d= %g %g %g %g\n',k,V1);
disp(str)
k=k+1;
%计算x2(i)
for i=1:n
s1=0;
s2=0;
if i-1>0
for j=1:i-1
s1=s1+a(i,j)*V2(j);
end
end
for j=i+1:n
s2=s2+a(i,j)*V1(j);
end
V2(i)=(b(i)-s1-s2)/a(i,i);
end
%计算误差向量
e=V2-V1;
%把x2作为新的迭代初值
V1=V2;
G=1;
IS=1;
GD1=40*exp(Vt*V1(1));
GD2=40*exp(Vt*V1(2));
ID1=exp(Vt*V1(1))-1;
IOD1=ID1-GD1*V1(1);
ID2=exp(Vt*V1(2))-1;
IOD2=ID2-GD2*V1(2);
a=[GD1+G -G;-G GD2+G];
b=[-IOD1+IS -IOD2];
end
%返回迭代步数
sp=k;
%返回迭代值
V=V2;