Linear algebra

  MATRIX


 [Features] To execute various calculations of Linear algebra.

 [Format] MATRIX "Array1= eigen(Array2)"

 [Explanation]
    Description method:
    matrix "VariableName = Linear algebra Formula"
    Right side is the various function names exclusive for 'MATRIX'
     and Array-variable name of the data source in parentheses.
    The format in the case of Four-arithmetic-operations calculation,
    "Array-variable1 Formula Array-variable2"
    The variable name is Numeric array variable without a parenthesis.
    The case of which left side is numerical value variable not Array:
    ->Determinant and rank.
    The array variables to be used must be declared at the beginning of the program in advance.
    If the size of array for substitute is different than requested one, automatically resized.
    (When different scope in [Array variable] and ['MATRIX' command execution],
     since resizing is impossible, it become an error)
    *About Complex numbers of input and output values, these are not supported at this stage.

    Matrix data are given by Array variable.
    (Think of array variables as matrix)
    If the columns count is [x] and the rows count is [y], it declare as [ dim dv1(y,x) ].
    If declaring [ dim dv1(2) ] in 'Basic' Array variable,
     3 variables of [0-2] will be declared.
    This is one larger size than the desired size,
    option base -1  (Please see the manual [OPTION BASE] for details)
    By writing this command, to make it to allocate 2 data from [0-1].
    This allocate become the same number as general language, C or Java.
    When dealing with linear algebra,
     be sure to write [option base -1] at the beginning of the program.
    When not writting, correct calculation result isn't obtained.

    About errors in linear algebra.
    If uncalculable error occurs in Linear algebra calculation,
     the program is not interrupted, it only return error code to 'ERR' function.
    Please check the success or failure of calculation in the state of 'ERR' function.
    'ERR' function is reset to 0 at the beginning of 'MATRIX' command execution.
    Linear algebra related errors.
     error 69:"Matrix error, uncalculable or cofactor 0"
     error 70:"Array size of matrix does not fit"

    Four arithmetic operations of Linear algebra.
    e.g
     10 option base-1
     20 dim dv1(2,2),dv2(2,2),dv3(2,2)
     30 dv2(0,0)=4:dv2(0,1)=-2:dv2(1,0)=1:dv2(1,1)=1
     40 dv3(0,0)=1:dv3(0,1)=2:dv3(1,0)=3:dv3(1,1)=4
     50 matrix "dv1=dv2+dv3"
     60 for y=0 to 1 : for x=0 to 1
     70 print dv1(y,x);
     80 next : print : next

    As something defined already up to 40 line, to explained using an example
     in which only [line50 'MATRIX' parameter] is changed.
    ('matrix' next line is result)
    Addition, Subtraction: It must be the same size in two calculation arrays.
    Multiply: It must be the same size in [left array column count] and [right array row count]
    Division: The two arrays must be square matricx of the same size.

    [Addition]
     matrix "dv1=dv2+dv3"
     5 0
     4 5

    [Subtraction]
     matrix "dv1=dv2-dv3"
     3 -4
     -2 -3

    [Multiply]
     matrix "dv1=dv2*dv3"
     -2 0
     4 6

    [Division]
     matrix "dv1=dv2/dv3"
     -7 5
     5.5 -3.5
    There is no division in linear algebra,
     it return the value obtained by multiplying by
     [Inverse matrix of division-matrix-dv3] from left side of dv2.

    --Internal function of 'MATRIX' command exclusive use--

    e.g. forEigenvalue
     10 optionbase-1
     20 dimdv1(2,2),dv2(2,2)
     30 dv2(0,0)=4:dv2(0,1)=-2:dv2(1,0)=1:dv2(1,1)=1
     40 matrix "dv1=eigen(dv2)"
     50 for y=0 to 1 : for x=0 to 1
     60 print dv1(y,x);
     70 next : print : next

    As something defined already up to 30 line, to explained using an example
     in which only [line40 'MATRIX' parameter] is changed.
    ('matrix' next line is result)

    [ DET ]
    To calculate Determinant from given Matrix.
     matrix "var=det(dv2)"
     6
    The left side specifies the usual numeric variable, not an array.
    The array(dv2) that give the data must be a square matrix.

    [ INV ]
    To calculate Inverse from given Matrix.
    matrix "dv1=inv(dv2)"
    0.1666 0.333
    -0.1666 0.666

    The array(dv1) to substitute must be a square matrix
     of the same size as the array(dv2) giving data.
    If Determinant of the given matrix is 0, Inverse matrix doesn't exist,
     so it become ['ERR' function=69] and it isn't calculated.
    (Program dosn't interruption)
    Others that use the inverse matrix during the calculation
    (Division, Simultaneous equations),
     if the Determinant becomes 0, to become ['ERR' function=69].

    [ EQUAT ]
    To find the solution of simultaneous equations with a matrix.
    e.g.  for Simultaneous equations.
    x+2y=4
    3x+5y=9
    Data to prepare(2x3)
    1 2 4
    3 5 9
    Program to find the solution of simultaneous equations of matrix with 'EQUAT' function.
     10 option base -1
     20 dim dv1(2,1),dv2(2,3)
     30 dv2(0,0)=1:dv2(0,1)=2:dv2(0,2)=4
     40 dv2(1,0)=3:dv2(1,1)=5:dv2(1,2)=9
     50 matrix "dv1=equat(dv2)"
     60 for y=0 to 1
     70 print dv1(y,0);
     80 next
    Output solution
    -2
    3
    (x=-2,y=3)
    *If rank of matrix is less than the number of rows, the solution may notbefound.

    When the right side of the expression is all 0.
    x-3y=0
    2x-6y=0
    Data in an array.
    1 -3 0
    2 -6 0
    The mutual ratio between each character expression.
    9
    3

    If the right side is all 0,
     the solution become impossible or indetermination,
     it cann't find a solution.
    But if it is indetermination, it's possible to calculate
     [The mutual ratio between each character expression].
    So in this case, the ratio is returned.(by integer)
    In this example,
     to verify with [substitute 9 for x],[substitute 3 for y]
    It becomes 0, same as the right side,
     it turns out that the result is right.
    In the case of this ratio, if the calculation is impossible,
     it become ['ERR' function=69], and the calculation is not performed.

    About the size of the array used.
    The array(dv2) that give the equation data,
     it prepare columns count 1 larger than a square matrix.
    The rightmost column will enter the numbers on right side of the equation.
    It set size [columns count=1, rows count=same as array that give the data]
     that the array be substitutioned the solution.
    It become that the solutions is lined up in a column vertical.

    [ EIGEN ]
    To calculate Eigenvalue from given Matrix.
    matrix "dv1=eigen(dv2)"
    3 0
    0 2
    The eigenvalues are arranged diagonally in the array as in the example, and returned.
    Because it doesn't supported to a complex number,
    If the eigenvalue is complex number, unregular value is returned.
    (It is not implemented that the judgment way of whether solution is complex number, yet)
    The array(dv1) to substitute must be a square matrix
     of the same size as the array(dv2) giving data.

    [ EVEC ]
    To calculate Eigenvector from given Matrix.
    matrix "dv1=evec(dv2)"
    2 1
    1 1
    The format of the returned array is this: (vertical arrangement)
     The Eigenvector of the 0th Eigenvalue is in 0th column,
     The Eigenvector of the 1th Eigenvalue is in 1th column...
    The array(dv1) to substitute must be a square matrix
     of the same size as the array(dv2) giving data.

    [ TRANS ]
    To return Transpose matrix from given Matrix.
    matrix "dv1=trans(dv2)"
    4 1
    -2 1
    The array(dv1) to substitute must be a square matrix
     of the same size as the array(dv2) giving data.

    [ RANK ]
    To return Rank from given Matrix.
    matrix "var=rank(dv2)"
    2
    The left side specifies the usual numeric variable, not an array.

    [ UNIT ]
    To return Unit matrix of specified number.
    matrix "dv1=unit(2)"
    1 0
    0 1
    To specify the square size in a number of the function.

    [ INTCV ]
    The data in array is integer-ized.
    Format: intcv(ArrayName,ProcessingLine,MaxInspectionValue,DetermineDigits)
    e.g.: matrix "dv1=intcv(dv2,-1,100,0.00001)"
    It examine whether [Each value in the given array] will be [Shaped integer ratio],
    If possible, Each value is converted to data in the ratio of integer, and returned.
    If it can't change to integer, to return the array of original values as is.
    ('ERR' function=69, None interruption)
    The range to be integerized can be specified either [Whole of array] or [Specified row].
    To use it in this case. For example,
    Matrix question made by a person that have an integer in the solution.
    It try to make this be integer-ized.

   Left side:
     Array(dv1) to substitute the result.
    -Parameter in the function-
   ArrayName:
     Array(dv2) which try to be integer-ized.
   ProcessingLine:  (Specify from 0-)
     To specify which column to be integer-ized.
     If -1 is specified, everything in the array is targeted.
   MaxInspectionValue:
    It is investigated to which integral number
     actually corresponds to minimum value that be standard integer.
    To set the upper limit value of the survey.
    If the survey reaches the upper limit and there is no prospect of integer-ized,
     it is judged that integer-izing is impossible.
    ('ERR' function=69, None interruption)
    The larger this value, the more likely it is to be integer-ization,
     but the processing load will be large.
   DetermineDigits:
    The larger digit numbers of a decimal(small number),
     the stricter judge criteria of integer-ized.
    The smaller digit numbers(big number) then roughly.
    If the value is not well known, please use the value of
     [ intcv(ArrayName,-1,100,0.00001) ] like the example.
    The array(dv1) to substitute must be a square matrix
     of the same size as the array(dv2) giving data.

    [ SETTING ]
    This is function which do setting, not calculation.
    matrix "var=setting(ret,0)"
    Various setting of Linear algebraic.
    To write the type of setting in the first parameter of function.
    (This word don't need to be enclosed in double quotation)
    -First parameter-
    [ret]
     To set whether the return value of Eigenvector is returned as a decimal or an integer.
    -Second parameter-
    0: Return value as a normalized decimal.
    1: Return value as an integer.(default)
     The left side is a temporary variable without meaning.
     Please specify a normal numeric variable, not an array.

    -The settings to decide number of iterations to convergence, judgment digits
     in calculating eigenvalue, eigenvector.
    [digit]
    Setting the digits to judge whether decimal converge to integers.
    For example, 'setting(digit,3)' [default=3] then, 
     the eigenvector '2.000567' is below the decimal point, and '0' continues 3 times,
     it is judged to converge on '2' of integer.
    The larger the number, the stricter the judgment.
    (the following number of 'rep' times also require a large number)
    [rep]
    The number of iterations when finding eigenvalues by QR decomposition.
    [default] setting(digit,3200)
    The number of times is larger, the more accurate value can be obtained.


 ---------------------------
 How to use the sample "linear.bas"
 ---------------------------

  When executed, the command selection screen appears.
  Enter the number.
 
  1.input 2.save 3.load 4.calc
 
  First, enter the data with '1.input'
  To enter the size of the row and column of the matrix.
 
  size x? (Enter columns count)
  size y? (Enter rows count)
  Let's enter the size of '2x2' as an example.
  (When equation data, to make the columns count increase by 1)

  Next enter the data.
  4 -2
  1 1
  Let's enter this matrix data.
  The columns number are counted from the right side.
  0,0 ? 4
  0,1 ? -2
  1,0 ? 1
  1,1 ? 1
 
  Let's saves the input data. (to memo the size of the matrix.)
  Please select [ 2.save ]
  Enter the save number. To try saving to number 1.
  No.1
  It was saved by pressing [Enter].
 
  Let's actually see the calculation result.
  Please select [ 4.calc ]
  Matrix data
  (Rank)
  (det)
  (mult:squared)
  displayed in this order.
  To tap the key to display more data.
  (inv)
  (Eigen)
  (Evec)
  This data will be displayed.
 
  Finally, the loading procedure is explained.
  Please select [ 3.load ]
  To enter the load number. Then try to load [No.1] earlier.
  No.1
  It's necessary to input the matrix size.
  Enter the size you noted earlier.
  size x? 2 (Enter columns count)
  size y? 2 (Enter rows count)
  It is now loaded.
 
  It's possible to make calculation result indicate variously
   by choosing [4.calc] by the procedure earlier.