Solve a toepltiz system of linear equations.
Solves toeplitz system. Solves toeplitz system, defined as:
The computational complexity of the algorithm is O(n2) as oposed to at least O(n3) for solving a general matrix. The solution is stored in vector X. B, FirstRow and FirstCol can be real or complex. R stands for First Row and C stands for First column. FirstCol.Length must be equal to FirstRow.Length-1.
Example 1
uses MtxExpr, Math387, MtxVec, MtxVecTee, MtxVecEdit, Toeplitz;
procedure TForm1.Button1Click(Sender: TObject);
var FirstRow,FirstCol,X1,X2,B,R: Vector;
A: Matrix;
begin
FirstRow.Size(4,False);
FirstCol.Size(3,False);
B.Size(4,false);
FirstRow[0] := 1;
FirstRow[1] := 2;
FirstRow[2] := 3;
FirstRow[3] := 4;
FirstCol[0] := 2;
FirstCol[1] := 3;
FirstCol[2] := 4;
A.Toeplitz(FirstRow,FirstCol);
B[0] := -2;
B[1] := -3;
B[2] := -4;
B[3] := -5;
R.Copy(FirstRow);
R.Resize(5);
R[4] := 5;
ToeplitzSolve(FirstRow,FirstCol,B,X1);
A.LUSolve(B,X2,mtGeneral);
if not X2.Equal(X1,EPS,cmpAbsolute) then Eraise('Not equal!');
ViewValues(X1,'Real X1',true);
Levinson(R,X2);
ViewValues(X2,'Real X2',true);
// Complex
FirstRow.Size(4,True);
FirstCol.Size(3,True);
B.Size(4,True);
FirstRow.CValues[0] := Cplx(1,0);
FirstRow.CValues[1] := Cplx(2,0);
FirstRow.CValues[2] := Cplx(3,-1);
FirstRow.CValues[3] := Cplx(4,0);
FirstCol.CValues[0] := Cplx(2,0);
FirstCol.CValues[1] := Cplx(3,1);
FirstCol.CValues[2] := Cplx(4,0);
A.Toeplitz(FirstRow,FirstCol);
B.CValues[0] := Cplx(-2,0);
B.CValues[1] := Cplx(-3,-1);
B.CValues[2] := Cplx(-4,0);
B.CValues[3] := Cplx(-5,0);
R.Copy(FirstRow);
R.Resize(5);
R.CValues[4] := Cplx(5,0);
ToeplitzSolve(FirstRow,FirstCol,B,X1);
A.LUSolve(B,X2,mtGeneral);
if not X2.Equal(X1,EPS*50,cmpAbsolute) then Eraise('Not equal!');
ViewValues(X1,'Complex X1',true);
Levinson(R,X2);
ViewValues(X2,'Complex X2',true);
end;
#include "MtxVecCPP.h" //MtxVecCPP.cpp must be included in the project
#include "MtxVecEdit.hpp"
#include "MtxVecTee.hpp"
#include "Toeplitz.hpp"
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
Vector FirstRow,FirstCol,X1,X2,B,R;
Matrix A;
FirstRow->Size(4,false);
FirstCol->Size(3,false);
B->Size(4,false);
FirstRow[0] = 1;
FirstRow[1] = 2;
FirstRow[2] = 3;
FirstRow[3] = 4;
FirstCol[0] = 2;
FirstCol[1] = 3;
FirstCol[2] = 4;
A->Toeplitz(FirstRow,FirstCol);
B[0] = -2;
B[1] = -3;
B[2] = -4;
B[3] = -5;
R->Copy(FirstRow);
R->Resize(5);
R[4] = 5;
ToeplitzSolve(FirstRow,FirstCol,B,X1);
A->LUSolve(B,X2,mtGeneral);
if ((X2->Equal(X1,10*EPS,cmpAbsolute)) == false)
{
throw "Not equal";
}
ViewValues(X1,"Real X1",true);
Levinson(R,X2);
ViewValues(X2,"Real X2",true);
// Complex
FirstRow->Size(4,true);
FirstCol->Size(3,true);
B->Size(4,True);
FirstRow->CValues[0] = Cplx(1,0);
FirstRow->CValues[1] = Cplx(2,0);
FirstRow->CValues[2] = Cplx(3,-1);
FirstRow->CValues[3] = Cplx(4,0);
FirstCol->CValues[0] = Cplx(2,0);
FirstCol->CValues[1] = Cplx(3,1);
FirstCol->CValues[2] = Cplx(4,0);
A->Toeplitz(FirstRow,FirstCol);
B->CValues[0] = Cplx(-2,0);
B->CValues[1] = Cplx(-3,-1);
B->CValues[2] = Cplx(-4,0);
B->CValues[3] = Cplx(-5,0);
R->Copy(FirstRow);
R->Resize(5);
R->CValues[4] = Cplx(5,0);
ToeplitzSolve(FirstRow,FirstCol,B,X1);
A->LUSolve(B,X2,mtGeneral);
if (!X2->Equal(X1,EPS*50,cmpAbsolute))
{
throw "Not equal!";
}
ViewValues(X1,"Complex X1",true);
Levinson(R,X2);
ViewValues(X2,"Complex X2",true);
}
using Dew.Math;
using Dew.Math.Units;
using Dew.Math.Editors;
namespace Dew.Examples
{
private void Example()
{
Vector FirstRow = new Vector(0);
Vector FirstCol = new Vector(0);
Vector X1 = new Vector(0);
Vector X2 = new Vector(0);
Vector B = new Vector(0);
Vector R = new Vector(0;
Matrix A = new Matrix(0,0);
FirstRow.SetIt(false,new double[] {1,2,3,4});
FirstCol.SetIt(false,new double[] {2,3,4});
A.Toeplitz(FirstRow,FirstCol);
B.SetIt(false, new double[] {-2,-3,-4,-5});
R.Copy(FirstRow);
R.Resize(5);
R.Values[4] = 5;
Toeplitz.ToeplitzSolve(FirstRow,FirstCol,B,X1);
A.LUSolve(B,X2,MtxVec.mtGeneral);
MtxVecEdit.ViewValues(X1,"Real X1",true);
Toeplitz.Levinson(R,X2);
MtxVecEdit.ViewValues(X2,"Real X2",true);
}
}