在matlab里用高斯消元法解方程组(23*23),但只解出来一部分准确值,其他的值就不准确了,请问若想把剩余的值解出用什么办法?
matlab 高斯消元法程序:
function [ x ] = gauss(A,b)
n=length(A);
a=[A,b];
for k=1:n-1
maxa=max(abs(a(k:n,k)));
if maxa==0
return;
end
for i=k:n
if abs(a(i,k))==maxa
y=a(i,k:n+1);a(i,k:n+1)=a(k,k:n+1);a(k,k:n+1)=y;
break;
end
end
for i=k+1:n
l(i,k)=a(i,k)/a(k,k);
a(i,k+1:n+1)=a(i,k+1:n+1)-l(i,k).*a(k,k+1:n+1);
end
end
%回代
if a(n,n)==0
return
end
x(n)=a(n,n+1)/a(n,n);
for i=n-1:-1:1
x(i)=(a(i,n+1)-sum(a(i,i+1:n).*x(i+1:n)))/a(i,i);
end
end
A系数都是类似这样的数1.233249766723970E-04、3.420321248530940E-03
B值都是9588.42、2310.5这样的正常一些的数
请各位高手帮帮忙!!!
我用cond(a)看了一下20*20的条件数大约是220.281324231037e+015,它的解有9个可以用,要怎样才能做平衡化弥补呢?
我用cond(a)看了一下20*20的条件数大约是220.281324231037e+015,它的解有9个可以用,要怎样才能做平衡化弥补呢?
追答平衡化的原理就是找两个对角阵D1,D2使得D1AD2的元素大小“比较接近”,代码可以参考
http://www.netlib.org/lapack/double/dgeequ.f
除非平衡化产生的D1和D2很对角元差距很大,否则不会有太本质的改进,你的问题太病态,不提供多余的信息也就无法得到有用的建议。