?? rdxqf.asv
字號:
function B=rdxqf(A,b)%此算法的好處是可以計算矩陣的一切形式的解,并不光光是矩陣是方陣,而且行列式為零;
B=[A,b];
[n,m]=size(B);
y=[1:m-1];
q=0;
for i=1:n;
if i>m-1;
q=3;
break;
end
a=0;
l=i;
while a==0;%判斷是否此列i的以下的每個元素都為零,
%若為零則a為零,此循環目的是找到有一列的元素不為零為止;
k=i;
p=abs(B(i,l));
for j=i:n;%此循環目的是在此列中找到絕對值最大的元素,
%此好處是防止在計算機中大數吃小數的,從而導制結果與精確值相差很大
if p<abs(B(j,l))
p=abs(B(j,l));
k=j;
end
end
a=round(abs(B(k,l))*1000)/1000;
if a==0;
l=l+1;
if l>m-1;
q=2;
break;
end
end
end
if q==2;
q=1;
break;
end
if a~=0;
if k~=i;%如果k與j不相等則把矩陣B的k行與i行相互交換;
C=eye(n);
C(i,i)=0;C(i,k)=1;
C(k,k)=0;C(k,i)=1;
B=C*B;
end
if i~=l;%如果只有到第l列時才有元素不為零,且i與l不相等,則進行i列與l相互交換;
D=eye(m);D1=eye(m-1);
D(i,l)=1;D1(i,l)=1;
D(i,i)=0;D1(i,i)=0;
D(l,l)=0;D1(l,l)=0;
D(l,i)=1;D1(l,i)=1;
B=B*D;y=y*D1;
end
B(i,:)=B(i,:)/B(i,i);
for o=1:n;%B矩陣的每一行除了第i行都用第i行的aji/aii倍去減第j行,使得每一行的第j列元素為零;
if o~=i;
B(o,:)=B(o,:)-B(i,:)*B(o,i);
end
end
end
B=round(B*1000000)/1000000;%此功能是為了在計算中由于計算機的計算的誤差使得原來本為零的數
%不為零的從而導致本誤解的應該跳出循環的而未能跳出
end
B=round(B*10000)/10000;%此功能是為了在計算中由于計算機的計算的誤差使得原來本為零的數
%不為零的從而導致判斷失誤,本誤解的而變成了有解的(值得注意的是在
%此當中并不精確從而導致的誤差是不可避免的經過此處理后計算并非有些
%誤差而已更加嚴重的是有可能導致計算的錯誤此算法需要改進,在此無能為力)
if q==1;%此情況是在據陣化到某一行下面的元素全部為零(其中m列出外)
if B(i:n,m)==zeros(n-i+1,1)
fprintf('此方程組的基礎解系為:(其中自由未知量為');
for t=i:m-1;
fprintf('%c%d\t','x',y(t));
end
fprintf(')');
fprintf('\n');
for t=1:m-1;
fprintf('%c%d\t','x',y(t));
end
fprintf('\n');
for t=i:m-1;%根據基礎解析的定義分別以t位置的元素取一其余的元素為0;
x1(i:m-1)=0;
x1(t)=1;
for r=1:i-1;%分別求每個元素在基礎解析下的值
x(r)=B(r,m);
for s=i:m-1;
x(r)=x(r)-B(r,s)*x1(s);
end
end
fprintf('%d\t',x);
fprintf('%d\t',x1(i:m-1));
fprintf('\n');
end
else
disp('此方程組沒有實數解1');
end
elseif q==3;
if B(i:n,m)~=zeros(i:n,1);%由于此矩陣的行小于列,如果化到最后b下面的全為零則無解
disp('此方程組沒有實數解2');
else%由于此矩陣的行小于列,如果化到最后b下面的全為零則有解
for r=1:i-1;
x(r)=B(r,m);
end
for t=1:i-1;
fprintf('%c%d=%f\n','x',y(t),x((t)));
end
end
else
disp('此方程組的解為:');
fprintf('\n');
for r=1:n;
x(r)=B(r,m);
end
for t=1:m-1;
fprintf('%c%d=%f\n','x',y(t),x(t));
end
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -