0) { $table[$m-1] = $table[$m-1] + 0.01; $ddv = dd($table); } $testViol = testViol($ddv); } return $table; } function vptable_discrete($n) { $table = array(); $v0 = 10; for($v=$v0+0.5;$v<=2*$v0-0.5;$v++) { $i = floor(imap($v,$n)); $table[floor($v)] = $i; } $i = array(-$table[10]-1); foreach($table as $imp) $i[] = $imp; $ddi = diff(diff($i)); $testViol = testViolNegative($ddi); while($testViol) { $m = minViolNegative($ddi); $i[$m+1] = $i[$m+1] - 1; $ddi = diff(diff($i)); $testViol = testViolNegative($ddi); } for($j=1;$j<=10;$j++) { $table[9+$j] = $i[$j]; } return $table; } // help functions function imap($v,$n) { $v0 = 10; $x = 15 * sqrt($n); $R = 0.236068; $logR = log($R); return $x * (log( 1 - (1-$R)*($v/$v0 - 1) )/$logR); } function dd($v) { $v = diff($v); foreach($v as $k=>$e) { $v[$k] = round($e*100); } $v = diff($v); array_unshift($v,0,0); return $v; } function diff($v) { $diff = array(); for($i=0;$i0) $sum++; } return $sum>0; } function testViolNegative($v) { $sum = 0; foreach($v as $k=>$e) { if($e<0) $sum++; } return $sum>0; } function minViol($v) { foreach($v as $k=>$e) { if($e>0) return $k; } return -1; } function minViolNegative($v) { foreach($v as $k=>$e) { if($e<0) return $k; } return -1; }