/var/www/enzatesting.onesolution.hk/inc/phpexcel_1.7.7/PHPExcel/Shared/JAMA/examples/polyfit.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
require_once "../Matrix.php";
/*
* @package JAMA
* @author Michael Bommarito
* @author Paul Meagher
* @version 0.1
*
* Function to fit an order n polynomial function through
* a series of x-y data points using least squares.
*
* @param $X array x values
* @param $Y array y values
* @param $n int order of polynomial to be used for fitting
* @returns array $coeffs of polynomial coefficients
* Pre-Conditions: the system is not underdetermined: sizeof($X) > $n+1
*/
function polyfit($X$Y$n) {
    for (
$i 0$i sizeof($X); ++$i)
        for (
$j 0$j <= $n; ++$j)
            
$A[$i][$j] = pow($X[$i], $j);
    for (
$i=0$i sizeof($Y); ++$i)
        
$B[$i] = array($Y[$i]);
    
$matrixA = new Matrix($A);
    
$matrixB = new Matrix($B);
    
$C $matrixA->solve($matrixB);
    return 
$C->getMatrix(0$n01);
}

function 
printpoly$C null ) {
    for(
$i $C->1$i >= 0; --$i) {
        
$r $C->get($i0);
        if ( 
abs($r) <= pow(10, -9) )
            
$r 0;
        if (
$i == $C->1)
            echo 
$r "x<sup>$i</sup>";
        else if (
$i $C->1)
            echo 
" + " $r "x<sup>$i</sup>";
        else if (
$i == 0)
            echo 
" + " $r;
    }
}

$X = array(0,1,2,3,4,5);
$Y = array(4,3,12,67,228579);
$points = new Matrix(array($X$Y));
$points->toHTML();
printpoly(polyfit($X$Y4));

echo 
'<hr />';

$X = array(0,1,2,3,4,5);
$Y = array(1,2,5,10,1726);
$points = new Matrix(array($X$Y));
$points->toHTML();
printpoly(polyfit($X$Y2));

echo 
'<hr />';

$X = array(0,1,2,3,4,5,6);
$Y = array(-90,-104,-178,-252,-2611604446);
$points = new Matrix(array($X$Y));
$points->toHTML();
printpoly(polyfit($X$Y5));

echo 
'<hr />';

$X = array(0,1,2,3,4);
$Y = array(mt_rand(010), mt_rand(4080), mt_rand(240400), mt_rand(18002215), mt_rand(80009000));
$points = new Matrix(array($X$Y));
$points->toHTML();
printpoly(polyfit($X$Y3));
?>