关于最小二乘法解线性方程组的源程序(30分)

  • 主题发起人 主题发起人 tom12345
  • 开始时间 开始时间
T

tom12345

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是来自JohnsonGuo的最小二乘法解线性方程组的源程序, 能否给出调用实例?
type
TMatrix = array of array of do
uble;
procedure MinSqrMul(m, n: Integer;
A: TMatrix;
b: array of do
uble;
var x: array of do
uble);
var
i, j, k: Integer;
ATA: array of array of do
uble;
ATb: array of do
uble;
Elem: do
uble;
begin
SetLength(ATA, n, n);
SetLength(ATb, n);
for i := 0 to n - 1 do
for j := 0 to n - 1 do
begin
ATA[i, j] := 0;
for k := 0 to m - 1 do
ATA[i, j] := ATA[i, j] + A[k, i] * A[k, j];
end;
for i := 0 to n - 1 do
begin
ATb := 0;
for j := 0 to m - 1 do
ATb := ATb + A[j, i] * b[j];
end;
for i := 0 to n - 1 do
begin
Elem := ATA[i, i];
for j := i to n - 1 do
ATA[i, j] := ATA[i, j] / Elem;
ATb := ATb / Elem;
for k := i + 1 to n - 1 do
begin
Elem := -ATA[k, i];
for j := k to n - 1 do
ATA[k, j] := ATA[k, j] + ATA[i, j] * Elem;
ATb[k] := ATb[k] + ATb * Elem;
end;
end;
x[n - 1] := ATb[n - 1];
for i := n - 2 do
wnto 0 do
begin
for j := i + 1 to n - 1 do
ATb := ATb - ATA[i, j] * x[j];
x := ATb;
end;
end;


 
var
m,n:integer;
a:array[1..2] of array[1..2] do
uble ;
b: array[1..2] of do
uble;
x: array[1..2] of do
uble
begin
m:=2;
n:=2;
a:={{3,4},{5,6}}
b:={7,8};
MinSqrMul(m, n, A, b,x);
end;
得出的x数组就是
3x+3y=7;
5x+6y=8;
的值
 
同意sonie
 
编译错误:
[Error] Unit1.pas(81): Expression expected but ',' found
[Error] Unit1.pas(82): Incompatible types
[Error] Unit1.pas(83): Incompatible types: 'Array' and 'TMatrix'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
 
解铃还需系铃人。
procedure TForm1.FormClick(Sender: TObject);
var
A: TMatrix;
b: array [0..2] of do
uble;
x: array [0..1] of do
uble;
begin
SetLength(A, 3, 2);
A[0, 0] := 1;
A[0, 1] := 2;
b[0] := 3;
A[1, 0] := 1;
A[1, 1] := 2;
b[1] := 4;
A[2, 0] := 2;
A[2, 1] := 1;
b[2] := 3;
MinSqrMul(3, 2, A, b, x);
ShowMessage(Format('%f, %f', [x[0], x[1]]));
end;

 
procedure TForm1.Button1Click(Sender: TObject);
var
A: TMatrix;
b: array [0..2] of do
uble;
x: array [0..2] of do
uble;
begin
SetLength(A, 3, 3);
A[0, 0] := 1;
A[0, 1] := 2;
A[0, 2] := 1;
b[0] := 9;
A[1, 0] := 2;
A[1, 1] := 3;
A[1, 2] := 4;
b[1] := 17;
A[2, 0] := 3;
A[2, 1] := 2;
A[2, 2] := 1;
b[2] := 13;
MinSqrMul(3, 3, A, b, x);
ShowMessage(Format('%f, %f, %f', [x[0], x[1], x[2]]));
end;
正确结果应为:x[0]=2,x[1]=3,x[2]=1,实际上运算错误。
 
I am sorry,程序中出了些错.
procedure MinSqrMul(m, n: Integer;
A: TMatrix;
b: array of do
uble;
var x: array of do
uble);
var
i, j, k: Integer;
ATA: array of array of do
uble;
ATb: array of do
uble;
Elem: do
uble;
begin
SetLength(ATA, n, n);
SetLength(ATb, n);
for i := 0 to n - 1 do
for j := 0 to n - 1 do
begin
ATA[i, j] := 0;
for k := 0 to m - 1 do
ATA[i, j] := ATA[i, j] + A[k, i] * A[k, j];
end;
for i := 0 to n - 1 do
begin
ATb := 0;
for j := 0 to m - 1 do
ATb := ATb + A[j, i] * b[j];
end;
for i := 0 to n - 1 do
begin
Elem := ATA[i, i];
for j := i to n - 1 do
ATA[i, j] := ATA[i, j] / Elem;
ATb := ATb / Elem;
for k := i + 1 to n - 1 do
begin
Elem := -ATA[k, i];
for j := [red]i + 1[/red] to n - 1 do
ATA[k, j] := ATA[k, j] + ATA[i, j] * Elem;
ATb[k] := ATb[k] + ATb * Elem;
end;
end;
x[n - 1] := ATb[n - 1];
for i := n - 2 do
wnto 0 do
begin
for j := i + 1 to n - 1 do
ATb := ATb - ATA[i, j] * x[j];
x := ATb;
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
A: TMatrix;
b: array [0..3] of Real;
x: array [0..3] of Real;
begin
SetLength(A, 4, 4);
A[0, 0] := 2;
A[0, 1] := 3;
A[0, 2] := 5;
A[0, 3] := 1;
b[0] := 21;
A[1, 0] := 3;
A[1, 1] := 4;
A[1, 2] := 2;
A[1, 3] := 3;
b[1] := 47;
A[2, 0] := 1;
A[2, 1] := 2;
A[2, 2] := 8;
A[2, 3] :=-1;
b[2] := -5;
A[3, 0] := 7;
A[3, 1] := 9;
A[3, 2] := 1;
A[3, 3] := 8;
b[3] := 120;
MinSqrMul(4, 4, A, b, x);
ShowMessage(Format('%f, %f, %f, %f', [x[0], x[1], x[2], x[3]]));
end;

正确结果应为:x[0]=3,x[1]=4,x[2]=-1,x[3]=8, 实际上运算错误。
 
哦,找本运筹学书kk吧,有算法的
 
很遗憾,你给出来的矩阵A是一个奇异阵,本子程序只适用于非奇异阵。
 
在深度历险有你需要的控件(带源码)下载!
 
请问JohnsonGuo,能否给出适用于所有矩阵的解线性方程组的方法,本人愿意再加分。
 
To tom12345:
你要首先搞清楚什么叫奇异阵(自己去看书吧,要解释要解释很久啦[:)])。
你给出来的矩阵有无穷多解,其通解为:
(57 - 14z - 5w, -31 - 11z + 3w, z, w)
其中,z, w为任意[red]复[/red]数,例如:
(66, -39, 1, 1), (57 + 19i, -31 - 14i, i, -i)也是其解。
你叫我如何给出所有答案呢?
 
JohnsonGuo,非常感谢。能否提供线性规化(求极大、极小值)方法的原程序?愿出高分。
 
好的,无问题,请开贴,并把LID发到mailto:johnson_guo@cmmail.com
 
后退
顶部