program QuadraticFit;
uses
SysUtils, Math;
const
N = 25; // 5x5 data points
type
TMatrix = array[1..6, 1..7] of Double;
TVector = array[1..6] of Double;
procedure SolveLinearSystem(var Matrix: TMatrix; var Solution: TVector);
var
i, j, k, m: Integer;
Temp: Double;
begin
// Gaussian elimination with partial pivoting
for k := 1 to 6 do
begin
// Find pivot
m := k;
for i := k+1 to 6 do
if Abs(Matrix[i,k]) > Abs(Matrix[m,k]) then
m := i;
// Swap rows
if m <> k then
for j := k to 7 do
begin
Temp := Matrix[k,j];
Matrix[k,j] := Matrix[m,j];
Matrix[m,j] := Temp;
end;
// Eliminate column
for i := k+1 to 6 do
begin
Temp := Matrix[i,k] / Matrix[k,k];
for j := k to 7 do
Matrix[i,j] := Matrix[i,j] - Temp * Matrix[k,j];
end;
end;
// Back substitution
for i := 6 downto 1 do
begin
Solution[i] := Matrix[i,7];
for j := i+1 to 6 do
Solution[i] := Solution[i] - Matrix[i,j] * Solution[j];
Solution[i] := Solution[i] / Matrix[i,i];
end;
end;
var
x, y, z: array[1..N] of Double;
Sx, Sy, Sz, Sx2, Sy2, Sxy, Sxz, Syz: Double;
Sx3, Sy3, Sx2y, Sxy2, Sx4, Sy4, Sx2y2: Double;
Sx3y, Sxy3, Sx2z, Sxyz, Sy2z: Double;
A, B, C, D, E, F: Double;
Matrix: TMatrix;
Solution: TVector;
i: Integer;
begin
x[1] := 0; y[1] := 1; z[1] := 5 + 4*0 + 3*1 + 2*0*0 + 0*1;
x[2] := 1; y[2] := 1; z[2] := 5 + 4*1 + 3*1 + 2*1*1 + 1*1;
x[3] := 2; y[3] := 1; z[3] := 5 + 4*2 + 3*1 + 2*2*2 + 2*1;
x[4] := 3; y[4] := 1; z[4] := 5 + 4*3 + 3*1 + 2*3*3 + 3*1;
x[5] := 4; y[5] := 1; z[5] := 5 + 4*4 + 3*1 + 2*4*4 + 4*1;
x[6] := 0; y[6] := 2; z[6] := 5 + 4*0 + 3*2 + 2*0*0 + 0*2;
x[7] := 1; y[7] := 2; z[7] := 5 + 4*1 + 3*2 + 2*1*1 + 1*2;
x[8] := 2; y[8] := 2; z[8] := 5 + 4*2 + 3*2 + 2*2*2 + 2*2;
x[9] := 3; y[9] := 2; z[9] := 5 + 4*3 + 3*2 + 2*3*3 + 3*2;
x[10] := 4; y[10] := 2; z[10] := 5 + 4*4 + 3*2 + 2*4*4 + 4*2;
x[11] := 0; y[11] := 3; z[11] := 5 + 4*0 + 3*3 + 2*0*0 + 0*3;
x[12] := 1; y[12] := 3; z[12] := 5 + 4*1 + 3*3 + 2*1*1 + 1*3;
x[13] := 2; y[13] := 3; z[13] := 5 + 4*2 + 3*3 + 2*2*2 + 2*3;
x[14] := 3; y[14] := 3; z[14] := 5 + 4*3 + 3*3 + 2*3*3 + 3*3;
x[15] := 4; y[15] := 3; z[15] := 5 + 4*4 + 3*3 + 2*4*4 + 4*3;
x[16] := 0; y[16] := 4; z[16] := 5 + 4*0 + 3*4 + 2*0*0 + 0*4;
x[17] := 1; y[17] := 4; z[17] := 5 + 4*1 + 3*4 + 2*1*1 + 1*4;
x[18] := 2; y[18] := 4; z[18] := 5 + 4*2 + 3*4 + 2*2*2 + 2*4;
x[19] := 3; y[19] := 4; z[19] := 5 + 4*3 + 3*4 + 2*3*3 + 3*4;
x[20] := 4; y[20] := 4; z[20] := 5 + 4*4 + 3*4 + 2*4*4 + 4*4;
x[21] := 0; y[21] := 5; z[21] := 5 + 4*0 + 3*5 + 2*0*0 + 0*5;
x[22] := 1; y[22] := 5; z[22] := 5 + 4*1 + 3*5 + 2*1*1 + 1*5;
x[23] := 2; y[23] := 5; z[23] := 5 + 4*2 + 3*5 + 2*2*2 + 2*5;
x[24] := 3; y[24] := 5; z[24] := 5 + 4*3 + 3*5 + 2*3*3 + 3*5;
x[25] := 4; y[25] := 5; z[25] := 5 + 4*4 + 3*5 + 2*4*4 + 4*5;
// Initialize sums
Sx := 0; Sy := 0; Sz := 0; Sx2 := 0; Sy2 := 0; Sxy := 0; Sxz := 0; Syz := 0;
Sx3 := 0; Sy3 := 0; Sx2y := 0; Sxy2 := 0; Sx4 := 0; Sy4 := 0; Sx2y2 := 0;
Sx3y := 0; Sxy3 := 0; Sx2z := 0; Sxyz := 0; Sy2z := 0;
// Compute sums
for i := 1 to N do
begin
Sx := Sx + x[i];
Sy := Sy + y[i];
Sz := Sz + z[i];
Sx2 := Sx2 + x[i]*x[i];
Sy2 := Sy2 + y[i]*y[i];
Sxy := Sxy + x[i]*y[i];
Sxz := Sxz + x[i]*z[i];
Syz := Syz + y[i]*z[i];
Sx3 := Sx3 + x[i]*x[i]*x[i];
Sy3 := Sy3 + y[i]*y[i]*y[i];
Sx2y := Sx2y + x[i]*x[i]*y[i];
Sxy2 := Sxy2 + x[i]*y[i]*y[i];
Sx4 := Sx4 + x[i]*x[i]*x[i]*x[i];
Sy4 := Sy4 + y[i]*y[i]*y[i]*y[i];
Sx2y2 := Sx2y2 + x[i]*x[i]*y[i]*y[i];
Sx3y := Sx3y + x[i]*x[i]*x[i]*y[i];
Sxy3 := Sxy3 + x[i]*y[i]*y[i]*y[i];
Sx2z := Sx2z + x[i]*x[i]*z[i];
Sxyz := Sxyz + x[i]*y[i]*z[i];
Sy2z := Sy2z + y[i]*y[i]*z[i];
end;
Matrix[1,1] := N; Matrix[1,2] := Sx; Matrix[1,3] := Sy; Matrix[1,4] := Sx2; Matrix[1,5] := Sxy; Matrix[1,6] := Sy2; Matrix[1,7] := Sz;
Matrix[2,1] := Sx; Matrix[2,2] := Sx2; Matrix[2,3] := Sxy; Matrix[2,4] := Sx3; Matrix[2,5] := Sx2y; Matrix[2,6] := Sxy2; Matrix[2,7] := Sxz;
Matrix[3,1] := Sy; Matrix[3,2] := Sxy; Matrix[3,3] := Sy2; Matrix[3,4] := Sx2y; Matrix[3,5] := Sxy2; Matrix[3,6] := Sy3; Matrix[3,7] := Syz;
Matrix[4,1] := Sx2; Matrix[4,2] := Sx3; Matrix[4,3] := Sx2y; Matrix[4,4] := Sx4; Matrix[4,5] := Sx3y; Matrix[4,6] := Sx2y2; Matrix[4,7] := Sx2z;
Matrix[5,1] := Sxy; Matrix[5,2] := Sx2y; Matrix[5,3] := Sxy2; Matrix[5,4] := Sx3y; Matrix[5,5] := Sx2y2; Matrix[5,6] := Sxy3; Matrix[5,7] := Sxyz;
Matrix[6,1] := Sy2; Matrix[6,2] := Sxy2; Matrix[6,3] := Sy3; Matrix[6,4] := Sx2y2; Matrix[6,5] := Sxy3; Matrix[6,6] := Sy4; Matrix[6,7] := Sy2z;
SolveLinearSystem(Matrix, Solution);
A := Solution[1];
B := Solution[2];
C := Solution[3];
D := Solution[4];
E := Solution[5];
F := Solution[6];
Writeln('Coefficients of F(x,y) = A + Bx + Cy + Dx^2 + Exy + Fy^2:');
Writeln('A = ', A:0:6);
Writeln('B = ', B:0:6);
Writeln('C = ', C:0:6);
Writeln('D = ', D:0:6);
Writeln('E = ', E:0:6);
Writeln('F = ', F:0:6);
end.
cHJvZ3JhbSBRdWFkcmF0aWNGaXQ7Cgp1c2VzCiAgU3lzVXRpbHMsIE1hdGg7Cgpjb25zdAogIE4gPSAyNTsgLy8gNXg1IGRhdGEgcG9pbnRzCgp0eXBlCiAgVE1hdHJpeCA9IGFycmF5WzEuLjYsIDEuLjddIG9mIERvdWJsZTsKICBUVmVjdG9yID0gYXJyYXlbMS4uNl0gb2YgRG91YmxlOwoKcHJvY2VkdXJlIFNvbHZlTGluZWFyU3lzdGVtKHZhciBNYXRyaXg6IFRNYXRyaXg7IHZhciBTb2x1dGlvbjogVFZlY3Rvcik7CnZhcgogIGksIGosIGssIG06IEludGVnZXI7CiAgVGVtcDogRG91YmxlOwpiZWdpbgogIC8vIEdhdXNzaWFuIGVsaW1pbmF0aW9uIHdpdGggcGFydGlhbCBwaXZvdGluZwogIGZvciBrIDo9IDEgdG8gNiBkbwogIGJlZ2luCiAgICAvLyBGaW5kIHBpdm90CiAgICBtIDo9IGs7CiAgICBmb3IgaSA6PSBrKzEgdG8gNiBkbwogICAgICBpZiBBYnMoTWF0cml4W2ksa10pID4gQWJzKE1hdHJpeFttLGtdKSB0aGVuCiAgICAgICAgbSA6PSBpOwogICAgCiAgICAvLyBTd2FwIHJvd3MKICAgIGlmIG0gPD4gayB0aGVuCiAgICAgIGZvciBqIDo9IGsgdG8gNyBkbwogICAgICBiZWdpbgogICAgICAgIFRlbXAgOj0gTWF0cml4W2ssal07CiAgICAgICAgTWF0cml4W2ssal0gOj0gTWF0cml4W20sal07CiAgICAgICAgTWF0cml4W20sal0gOj0gVGVtcDsKICAgICAgZW5kOwoKICAgIC8vIEVsaW1pbmF0ZSBjb2x1bW4KICAgIGZvciBpIDo9IGsrMSB0byA2IGRvCiAgICBiZWdpbgogICAgICBUZW1wIDo9IE1hdHJpeFtpLGtdIC8gTWF0cml4W2ssa107CiAgICAgIGZvciBqIDo9IGsgdG8gNyBkbwogICAgICAgIE1hdHJpeFtpLGpdIDo9IE1hdHJpeFtpLGpdIC0gVGVtcCAqIE1hdHJpeFtrLGpdOwogICAgZW5kOwogIGVuZDsKCiAgLy8gQmFjayBzdWJzdGl0dXRpb24KICBmb3IgaSA6PSA2IGRvd250byAxIGRvCiAgYmVnaW4KICAgIFNvbHV0aW9uW2ldIDo9IE1hdHJpeFtpLDddOwogICAgZm9yIGogOj0gaSsxIHRvIDYgZG8KICAgICAgU29sdXRpb25baV0gOj0gU29sdXRpb25baV0gLSBNYXRyaXhbaSxqXSAqIFNvbHV0aW9uW2pdOwogICAgU29sdXRpb25baV0gOj0gU29sdXRpb25baV0gLyBNYXRyaXhbaSxpXTsKICBlbmQ7CmVuZDsKCnZhcgogIHgsIHksIHo6IGFycmF5WzEuLk5dIG9mIERvdWJsZTsKICBTeCwgU3ksIFN6LCBTeDIsIFN5MiwgU3h5LCBTeHosIFN5ejogRG91YmxlOwogIFN4MywgU3kzLCBTeDJ5LCBTeHkyLCBTeDQsIFN5NCwgU3gyeTI6IERvdWJsZTsKICBTeDN5LCBTeHkzLCBTeDJ6LCBTeHl6LCBTeTJ6OiBEb3VibGU7CiAgQSwgQiwgQywgRCwgRSwgRjogRG91YmxlOwogIE1hdHJpeDogVE1hdHJpeDsKICBTb2x1dGlvbjogVFZlY3RvcjsKICBpOiBJbnRlZ2VyOwoKYmVnaW4KICAKICB4WzFdIDo9IDA7IHlbMV0gOj0gMTsgelsxXSA6PSA1ICsgNCowICsgMyoxICsgMiowKjAgKyAwKjE7IAogIHhbMl0gOj0gMTsgeVsyXSA6PSAxOyB6WzJdIDo9IDUgKyA0KjEgKyAzKjEgKyAyKjEqMSArIDEqMTsgCiAgeFszXSA6PSAyOyB5WzNdIDo9IDE7IHpbM10gOj0gNSArIDQqMiArIDMqMSArIDIqMioyICsgMioxOyAKICB4WzRdIDo9IDM7IHlbNF0gOj0gMTsgels0XSA6PSA1ICsgNCozICsgMyoxICsgMiozKjMgKyAzKjE7CiAgeFs1XSA6PSA0OyB5WzVdIDo9IDE7IHpbNV0gOj0gNSArIDQqNCArIDMqMSArIDIqNCo0ICsgNCoxOwogIHhbNl0gOj0gMDsgeVs2XSA6PSAyOyB6WzZdIDo9IDUgKyA0KjAgKyAzKjIgKyAyKjAqMCArIDAqMjsKICB4WzddIDo9IDE7IHlbN10gOj0gMjsgels3XSA6PSA1ICsgNCoxICsgMyoyICsgMioxKjEgKyAxKjI7CiAgeFs4XSA6PSAyOyB5WzhdIDo9IDI7IHpbOF0gOj0gNSArIDQqMiArIDMqMiArIDIqMioyICsgMioyOwogIHhbOV0gOj0gMzsgeVs5XSA6PSAyOyB6WzldIDo9IDUgKyA0KjMgKyAzKjIgKyAyKjMqMyArIDMqMjsgCiAgeFsxMF0gOj0gNDsgeVsxMF0gOj0gMjsgelsxMF0gOj0gNSArIDQqNCArIDMqMiArIDIqNCo0ICsgNCoyOyAKICB4WzExXSA6PSAwOyB5WzExXSA6PSAzOyB6WzExXSA6PSA1ICsgNCowICsgMyozICsgMiowKjAgKyAwKjM7CiAgeFsxMl0gOj0gMTsgeVsxMl0gOj0gMzsgelsxMl0gOj0gNSArIDQqMSArIDMqMyArIDIqMSoxICsgMSozOwogIHhbMTNdIDo9IDI7IHlbMTNdIDo9IDM7IHpbMTNdIDo9IDUgKyA0KjIgKyAzKjMgKyAyKjIqMiArIDIqMzsgCiAgeFsxNF0gOj0gMzsgeVsxNF0gOj0gMzsgelsxNF0gOj0gNSArIDQqMyArIDMqMyArIDIqMyozICsgMyozOyAKICB4WzE1XSA6PSA0OyB5WzE1XSA6PSAzOyB6WzE1XSA6PSA1ICsgNCo0ICsgMyozICsgMio0KjQgKyA0KjM7IAogIHhbMTZdIDo9IDA7IHlbMTZdIDo9IDQ7IHpbMTZdIDo9IDUgKyA0KjAgKyAzKjQgKyAyKjAqMCArIDAqNDsgCiAgeFsxN10gOj0gMTsgeVsxN10gOj0gNDsgelsxN10gOj0gNSArIDQqMSArIDMqNCArIDIqMSoxICsgMSo0OyAKICB4WzE4XSA6PSAyOyB5WzE4XSA6PSA0OyB6WzE4XSA6PSA1ICsgNCoyICsgMyo0ICsgMioyKjIgKyAyKjQ7IAogIHhbMTldIDo9IDM7IHlbMTldIDo9IDQ7IHpbMTldIDo9IDUgKyA0KjMgKyAzKjQgKyAyKjMqMyArIDMqNDsKICB4WzIwXSA6PSA0OyB5WzIwXSA6PSA0OyB6WzIwXSA6PSA1ICsgNCo0ICsgMyo0ICsgMio0KjQgKyA0KjQ7IAogIHhbMjFdIDo9IDA7IHlbMjFdIDo9IDU7IHpbMjFdIDo9IDUgKyA0KjAgKyAzKjUgKyAyKjAqMCArIDAqNTsgCiAgeFsyMl0gOj0gMTsgeVsyMl0gOj0gNTsgelsyMl0gOj0gNSArIDQqMSArIDMqNSArIDIqMSoxICsgMSo1OyAKICB4WzIzXSA6PSAyOyB5WzIzXSA6PSA1OyB6WzIzXSA6PSA1ICsgNCoyICsgMyo1ICsgMioyKjIgKyAyKjU7IAogIHhbMjRdIDo9IDM7IHlbMjRdIDo9IDU7IHpbMjRdIDo9IDUgKyA0KjMgKyAzKjUgKyAyKjMqMyArIDMqNTsKICB4WzI1XSA6PSA0OyB5WzI1XSA6PSA1OyB6WzI1XSA6PSA1ICsgNCo0ICsgMyo1ICsgMio0KjQgKyA0KjU7IAoKICAvLyBJbml0aWFsaXplIHN1bXMKICBTeCA6PSAwOyBTeSA6PSAwOyBTeiA6PSAwOyBTeDIgOj0gMDsgU3kyIDo9IDA7IFN4eSA6PSAwOyBTeHogOj0gMDsgU3l6IDo9IDA7CiAgU3gzIDo9IDA7IFN5MyA6PSAwOyBTeDJ5IDo9IDA7IFN4eTIgOj0gMDsgU3g0IDo9IDA7IFN5NCA6PSAwOyBTeDJ5MiA6PSAwOwogIFN4M3kgOj0gMDsgU3h5MyA6PSAwOyBTeDJ6IDo9IDA7IFN4eXogOj0gMDsgU3kyeiA6PSAwOwoKICAvLyBDb21wdXRlIHN1bXMKICBmb3IgaSA6PSAxIHRvIE4gZG8KICBiZWdpbgogICAgU3ggOj0gU3ggKyB4W2ldOwogICAgU3kgOj0gU3kgKyB5W2ldOwogICAgU3ogOj0gU3ogKyB6W2ldOwogICAgU3gyIDo9IFN4MiArIHhbaV0qeFtpXTsKICAgIFN5MiA6PSBTeTIgKyB5W2ldKnlbaV07CiAgICBTeHkgOj0gU3h5ICsgeFtpXSp5W2ldOwogICAgU3h6IDo9IFN4eiArIHhbaV0qeltpXTsKICAgIFN5eiA6PSBTeXogKyB5W2ldKnpbaV07CiAgICBTeDMgOj0gU3gzICsgeFtpXSp4W2ldKnhbaV07CiAgICBTeTMgOj0gU3kzICsgeVtpXSp5W2ldKnlbaV07CiAgICBTeDJ5IDo9IFN4MnkgKyB4W2ldKnhbaV0qeVtpXTsKICAgIFN4eTIgOj0gU3h5MiArIHhbaV0qeVtpXSp5W2ldOwogICAgU3g0IDo9IFN4NCArIHhbaV0qeFtpXSp4W2ldKnhbaV07CiAgICBTeTQgOj0gU3k0ICsgeVtpXSp5W2ldKnlbaV0qeVtpXTsKICAgIFN4MnkyIDo9IFN4MnkyICsgeFtpXSp4W2ldKnlbaV0qeVtpXTsKICAgIFN4M3kgOj0gU3gzeSArIHhbaV0qeFtpXSp4W2ldKnlbaV07CiAgICBTeHkzIDo9IFN4eTMgKyB4W2ldKnlbaV0qeVtpXSp5W2ldOwogICAgU3gyeiA6PSBTeDJ6ICsgeFtpXSp4W2ldKnpbaV07CiAgICBTeHl6IDo9IFN4eXogKyB4W2ldKnlbaV0qeltpXTsKICAgIFN5MnogOj0gU3kyeiArIHlbaV0qeVtpXSp6W2ldOwogIGVuZDsKCiAKICBNYXRyaXhbMSwxXSA6PSBOOyAgICBNYXRyaXhbMSwyXSA6PSBTeDsgICBNYXRyaXhbMSwzXSA6PSBTeTsgICBNYXRyaXhbMSw0XSA6PSBTeDI7ICBNYXRyaXhbMSw1XSA6PSBTeHk7ICBNYXRyaXhbMSw2XSA6PSBTeTI7ICBNYXRyaXhbMSw3XSA6PSBTejsKICBNYXRyaXhbMiwxXSA6PSBTeDsgICBNYXRyaXhbMiwyXSA6PSBTeDI7ICBNYXRyaXhbMiwzXSA6PSBTeHk7ICBNYXRyaXhbMiw0XSA6PSBTeDM7ICBNYXRyaXhbMiw1XSA6PSBTeDJ5OyBNYXRyaXhbMiw2XSA6PSBTeHkyOyBNYXRyaXhbMiw3XSA6PSBTeHo7CiAgTWF0cml4WzMsMV0gOj0gU3k7ICAgTWF0cml4WzMsMl0gOj0gU3h5OyAgTWF0cml4WzMsM10gOj0gU3kyOyAgTWF0cml4WzMsNF0gOj0gU3gyeTsgTWF0cml4WzMsNV0gOj0gU3h5MjsgTWF0cml4WzMsNl0gOj0gU3kzOyAgTWF0cml4WzMsN10gOj0gU3l6OwogIE1hdHJpeFs0LDFdIDo9IFN4MjsgIE1hdHJpeFs0LDJdIDo9IFN4MzsgIE1hdHJpeFs0LDNdIDo9IFN4Mnk7IE1hdHJpeFs0LDRdIDo9IFN4NDsgIE1hdHJpeFs0LDVdIDo9IFN4M3k7IE1hdHJpeFs0LDZdIDo9IFN4MnkyOyBNYXRyaXhbNCw3XSA6PSBTeDJ6OwogIE1hdHJpeFs1LDFdIDo9IFN4eTsgIE1hdHJpeFs1LDJdIDo9IFN4Mnk7IE1hdHJpeFs1LDNdIDo9IFN4eTI7IE1hdHJpeFs1LDRdIDo9IFN4M3k7IE1hdHJpeFs1LDVdIDo9IFN4MnkyOyBNYXRyaXhbNSw2XSA6PSBTeHkzOyBNYXRyaXhbNSw3XSA6PSBTeHl6OwogIE1hdHJpeFs2LDFdIDo9IFN5MjsgIE1hdHJpeFs2LDJdIDo9IFN4eTI7IE1hdHJpeFs2LDNdIDo9IFN5MzsgIE1hdHJpeFs2LDRdIDo9IFN4MnkyOyBNYXRyaXhbNiw1XSA6PSBTeHkzOyBNYXRyaXhbNiw2XSA6PSBTeTQ7ICBNYXRyaXhbNiw3XSA6PSBTeTJ6OwoKICAKICBTb2x2ZUxpbmVhclN5c3RlbShNYXRyaXgsIFNvbHV0aW9uKTsKCiAgCiAgQSA6PSBTb2x1dGlvblsxXTsKICBCIDo9IFNvbHV0aW9uWzJdOwogIEMgOj0gU29sdXRpb25bM107CiAgRCA6PSBTb2x1dGlvbls0XTsKICBFIDo9IFNvbHV0aW9uWzVdOwogIEYgOj0gU29sdXRpb25bNl07CgogIAogIFdyaXRlbG4oJ0NvZWZmaWNpZW50cyBvZiBGKHgseSkgPSBBICsgQnggKyBDeSArIER4XjIgKyBFeHkgKyBGeV4yOicpOwogIFdyaXRlbG4oJ0EgPSAnLCBBOjA6Nik7CiAgV3JpdGVsbignQiA9ICcsIEI6MDo2KTsKICBXcml0ZWxuKCdDID0gJywgQzowOjYpOwogIFdyaXRlbG4oJ0QgPSAnLCBEOjA6Nik7CiAgV3JpdGVsbignRSA9ICcsIEU6MDo2KTsKICBXcml0ZWxuKCdGID0gJywgRjowOjYpOwplbmQu