public class ThetaDegree extends Object implements Serializable, Cloneable
The de.jtem.riemann theta function of degree d
and subdegree s
is defined by its
mulit-dimensional Fourier series
θs,d(z|B) = ∑n∈Zg
exp( ½(B(n+s/d),dn+s)+(z,dn+s) )
,
z∈Cg,B∈Cgxg
,
and si<d.
B
is symmetric and has strictly negative definite real part.
The exponential growth in z
of the Riemann theta function can be factored
out and the remaining oscillatory part can be approximated with a prescribed error
tolerance. Thus we have:
θs,d(z|B) = exp( factor(z|B) ) · thetaSums,d(z|B)
,
Separating the exponential factor is crucial when dealing with theta functions. In practice, they often appear as ratios, in which case the exponential growth can be canceled.
Evaluating the theta function may easily lead to overflows or numerical instabilities, which should be avoid.
To create a theta function object you must provide degree, subdegree and period matrix and you may provide an error tolerance.
You may switch off the use of a fill factor error. The fill factor error is a heuristic to
improve the accuracy of the error prediction. As mentioned earlier the estimates which lead
to the approximation error are rather coarse, which is improved by this heuristic for
the price of loosing the certainty of the 100% error. The smaller
the fill factor, the bigger its influence on the approximation, which
anyway is usually irrelevant for small genus (g<4
).
Further reading:
- | B.Deconinck, M.Heil, A.I.Bobenko, M.van Hoeij, and M.Schmies. Computing Riemann Theta Functions. Is to appear. |
- | M.Heil. Numerical Tools for the study of finite gap solutions of integrable systems. PhD thesis, Technische Universität Berlin, 1995. |
- | E.D.Belokolos, A.I.Bobenko, V.Z.Enolskii, A.R.Its, and V.B.Matveev. Algebro-geometric appoach to nonlinear integrable probems. Springer-Verlag Berlin, 1994. |
- | R.Narasimhan.Compact Riemann Surfaces. Basel, 1992. |
Theta
,
TransformPropertySupport
,
AbelianFunction
,
Serialized FormConstructor and Description |
---|
ThetaDegree(de.jtem.blas.ComplexMatrix periodMatrix,
double tol,
int degree,
de.jtem.blas.IntegerVector subDegree)
Creates a Riemann theta function of degree
degree and subdegree
subDegree with prescribed periodMatrix and
error tolerance tol , the fill factor error
is used. |
ThetaDegree(de.jtem.blas.ComplexMatrix periodMatrix,
int degree,
de.jtem.blas.IntegerVector subDegree)
Creates a Riemann theta function of degree
degree and subdegree
subDegree with prescribed periodMatrix . |
Modifier and Type | Method and Description |
---|---|
de.jtem.mfc.field.Complex |
ddLogTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X,
de.jtem.blas.ComplexVector Y)
Evaluates the first logarythmic derivative of the Riemann theta funciton
in the
X and Y direction at Z . |
void |
ddLogTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X,
de.jtem.blas.ComplexVector Y,
de.jtem.mfc.field.Complex DXDYLogThetaAtZ)
Evaluates the second logarythmic derivative of the Riemann theta funciton
in the
X and the Y direction at Z . |
de.jtem.mfc.field.Complex |
ddTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X,
de.jtem.blas.ComplexVector Y)
Evaluates the Riemann theta function, its first derivative
in the
X and Y direction and,
its second derivative into the same direction at Z . |
void |
ddTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X,
de.jtem.blas.ComplexVector Y,
de.jtem.mfc.field.Complex thetaAtZ,
de.jtem.mfc.field.Complex DXThetaAtZ,
de.jtem.mfc.field.Complex DYThetaAtZ,
de.jtem.mfc.field.Complex DXDYThetaAtZ)
Evaluates the Riemann theta function, its first derivative
in the
X and Y direction and,
its second derivative into the same direction at Z . |
void |
ddTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X,
de.jtem.blas.ComplexVector Y,
de.jtem.mfc.field.Complex factor,
de.jtem.mfc.field.Complex thetaSumZ,
de.jtem.mfc.field.Complex thetaSumX,
de.jtem.mfc.field.Complex thetaSumY,
de.jtem.mfc.field.Complex thetaSumXY)
Evaluates the Riemann theta function, its first derivatives
in the
X and Y direction and,
its second derivative into the same direction at Z . |
de.jtem.mfc.field.Complex |
dLogTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X)
Returns the first logarythmic derivative of the Riemann theta function
in the
X direction at Z . |
void |
dLogTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X,
de.jtem.mfc.field.Complex DXLogThetaAtZ)
Evaluates the first logarythmic derivative of the Riemann theta funciton
in the
X direction at Z . |
de.jtem.mfc.field.Complex |
dTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X)
Returns the first derivative of the Riemann theta function
in the
X direction at Z . |
void |
dTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X,
de.jtem.mfc.field.Complex thetaAtZ,
de.jtem.mfc.field.Complex DXThetaAtZ)
Evaluates the Riemann theta function and its first derivative
in the
X direction at Z . |
void |
dTheta(de.jtem.blas.ComplexVector Z,
de.jtem.blas.ComplexVector X,
de.jtem.mfc.field.Complex factor,
de.jtem.mfc.field.Complex thetaSumZ,
de.jtem.mfc.field.Complex thetaSumX)
Evaluates the Riemann theta function and its first derivative
in the
X direction at Z . |
int |
getDim()
Returns the dimension of the complex vector space on which the Riemann theta
functions operates.
|
double |
getFillFactor()
Returns the fill factor.
|
int |
getNumOfLatticePoints()
Returns number of lattice points which are used for the uniform approximation
of the oscillatory part of the Riemann theta function.
|
de.jtem.blas.ComplexMatrix |
getPeriodMatrix()
Returns period matrix on which the Riemann theta function operates.
|
double |
getRadius()
Returns radius of ellipsoid which is used to determine the lattice
points which are used for the uniform approximation
of the oscillatory part of the Riemann theta function.
|
double |
getTol()
Returns the error tolerance for the oscillatory part of the theta function.
|
boolean |
getUseFillFactorError()
Returns whether the heuristic of the fill factor error is used or not.
|
void |
setPeriodMatrix(de.jtem.blas.ComplexMatrix periodMatrix)
Sets periodMatrix on which the Riemann theta function operates.
|
void |
setSubDegree(de.jtem.blas.IntegerVector subDegree)
Sets the subdegree.
|
void |
setTol(double tol)
Sets the error tolerance for the oscillatory part of the theta function.
|
void |
setUseFillFactorError(boolean useFillFactorError)
Switches the heuristic fill factor error on or off.
|
de.jtem.mfc.field.Complex |
theta(de.jtem.blas.ComplexVector Z)
Returns the Riemann theta function at
Z . |
void |
theta(de.jtem.blas.ComplexVector Z,
de.jtem.mfc.field.Complex thetaAtZ)
Evaluates the Riemann theta function at
Z . |
void |
theta(de.jtem.blas.ComplexVector Z,
de.jtem.mfc.field.Complex factor,
de.jtem.mfc.field.Complex thetaSumZ)
Evaluates the Riemann theta function at
Z . |
public ThetaDegree(de.jtem.blas.ComplexMatrix periodMatrix, double tol, int degree, de.jtem.blas.IntegerVector subDegree)
degree
and subdegree
subDegree
with prescribed periodMatrix
and
error tolerance tol
, the fill factor error
is used.periodMatrix
- symmetric complex matrix with negative definite real partdegree
- is a positve integersubDegree
- is an integer vector with the same dimension as periodMatrix
public ThetaDegree(de.jtem.blas.ComplexMatrix periodMatrix, int degree, de.jtem.blas.IntegerVector subDegree)
degree
and subdegree
subDegree
with prescribed periodMatrix
.
The error tolerance is by default e-7
, the fill factor error
is used.periodMatrix
- symmetric complex matrix with negative definite real partdegree
- is a positve integersubDegree
- is an integer vector with the same dimension as periodMatrix
public final void ddTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X, de.jtem.blas.ComplexVector Y, de.jtem.mfc.field.Complex factor, de.jtem.mfc.field.Complex thetaSumZ, de.jtem.mfc.field.Complex thetaSumX, de.jtem.mfc.field.Complex thetaSumY, de.jtem.mfc.field.Complex thetaSumXY)
X
and Y
direction and,
its second derivative into the same direction at Z
.
θ(z|B) = exp( factor ) · thetaSumZ
DXθ(z|B) = exp( factor ) · thetaSumX
DYθ(z|B) = exp( factor ) · thetaSumY
D²X,Yθ(z|B) = exp( factor ) · thetaSumXY
Evaluating the Riemann theta funciton and its first derivative simultanesly can be performed with almost no extra cost.
Z
- argument vectorX
- direction of derivativeY
- direction of derivativefactor
- exponential partthetaSumZ
- oscillatory partthetaSumX
- oscillatory part of first derivative in X
directionthetaSumY
- oscillatory part of first derivative in Y
directionthetaSumXY
- oscillatory part of second derivativepublic final void dTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X, de.jtem.mfc.field.Complex factor, de.jtem.mfc.field.Complex thetaSumZ, de.jtem.mfc.field.Complex thetaSumX)
X
direction at Z
.
θ(z|B) = exp( factor ) · thetaSumZ
DXθ(z|B) = exp( factor ) · thetaSumX
Evaluating the Riemann theta funciton and its first derivative simultanesly can be performed with almost no extra cost.
Z
- argument vectorX
- direction of derivativefactor
- exponential partthetaSumZ
- oscillatory partthetaSumX
- oscillatory part of first derivative in X
directionpublic final int getDim()
public final double getFillFactor()
public final int getNumOfLatticePoints()
public final de.jtem.blas.ComplexMatrix getPeriodMatrix()
public final double getRadius()
public final double getTol()
public final boolean getUseFillFactorError()
public final void setPeriodMatrix(de.jtem.blas.ComplexMatrix periodMatrix)
periodMatrix
- symmetric complex matrix with negative definite real partpublic void setSubDegree(de.jtem.blas.IntegerVector subDegree)
public final void setTol(double tol)
tol
- positive numberpublic final void setUseFillFactorError(boolean useFillFactorError)
useFillFactorError
- controles whether the fill factor or the 100% error is used.public final void theta(de.jtem.blas.ComplexVector Z, de.jtem.mfc.field.Complex factor, de.jtem.mfc.field.Complex thetaSumZ)
Z
.
θ(z|B) = exp( factor ) · thetaSumZ
Z
- argument vectorfactor
- exponential partthetaSumZ
- oscillatory partpublic final de.jtem.mfc.field.Complex ddLogTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X, de.jtem.blas.ComplexVector Y)
X
and Y
direction at Z
.
D²X,Ylog( θ(z|B) ) = DXDYLogThetaAtZ
Z
- argument vectorX
- direction of derivativeY
- direction of derivativeX
and Y
directionpublic final void ddLogTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X, de.jtem.blas.ComplexVector Y, de.jtem.mfc.field.Complex DXDYLogThetaAtZ)
X
and the Y
direction at Z
.
D²X,Ylog( θ(z|B) ) = DXDYLogThetaAtZ
Z
- argument vectorX
- direction of derivativeY
- direction of derivativeDXDYLogThetaAtZ
- second logarythmic derivative in the X
and the Y
directionpublic final de.jtem.mfc.field.Complex ddTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X, de.jtem.blas.ComplexVector Y)
X
and Y
direction and,
its second derivative into the same direction at Z
.Z
- argument vectorX
- direction of derivativeY
- direction of derivativethetaAtZ
- oscillatory partDXThetaAtZ
- oscillatory part of first derivative in X
directionDYThetaAtZ
- oscillatory part of first derivative in Y
directionDXDYThetaAtZ
- oscillatory part of second derivativepublic final void ddTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X, de.jtem.blas.ComplexVector Y, de.jtem.mfc.field.Complex thetaAtZ, de.jtem.mfc.field.Complex DXThetaAtZ, de.jtem.mfc.field.Complex DYThetaAtZ, de.jtem.mfc.field.Complex DXDYThetaAtZ)
X
and Y
direction and,
its second derivative into the same direction at Z
.
θ(z|B) = thetaAtZ
DX θ(z|B) = DXThetaAtZ
DY θ(z|B) = DYThetaAtZ
D²X,Yθ(z|B) = DXDYThetaAtZ
Evaluating the Riemann theta funciton and its first derivative simultanesly can be performed with almost no extra cost.
Z
- argument vectorX
- direction of derivativeY
- direction of derivativethetaAtZ
- oscillatory partDXThetaAtZ
- oscillatory part of first derivative in X
directionDYThetaAtZ
- oscillatory part of first derivative in Y
directionDXDYThetaAtZ
- oscillatory part of second derivativepublic final de.jtem.mfc.field.Complex dLogTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X)
X
direction at Z
.Z
- argument vectorX
- direction of derivativeX
directionpublic final void dLogTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X, de.jtem.mfc.field.Complex DXLogThetaAtZ)
X
direction at Z
.
DXlog( θ(z|B) ) = DXLogThetaAtZ
Z
- argument vectorX
- direction of derivativeDXLogThetaAtZ
- first logarythmic derivative in X
directionpublic final de.jtem.mfc.field.Complex dTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X)
X
direction at Z
.Z
- argument vectorX
- direction of derivativeX
directionpublic final void dTheta(de.jtem.blas.ComplexVector Z, de.jtem.blas.ComplexVector X, de.jtem.mfc.field.Complex thetaAtZ, de.jtem.mfc.field.Complex DXThetaAtZ)
X
direction at Z
.
θ(z|B) = thetaAtZ
DXθ(z|B) = DXThetaAtZ
Evaluating the Riemann theta funciton and its first derivative simultanesly can be performed with almost no extra cost.
Z
- argument vectorX
- direction of derivativethetaAtZ
- value of the Riemann theta function at Z
DXThetaAtZ
- value of first derivative in X
directionpublic final de.jtem.mfc.field.Complex theta(de.jtem.blas.ComplexVector Z)
Z
.Z
- argument vectorZ
public final void theta(de.jtem.blas.ComplexVector Z, de.jtem.mfc.field.Complex thetaAtZ)
Z
.
θ(z|B) = thetaAtZ
Z
- argument vectorthetaAtZ
- value of the Riemann theta function at Z