Rational geometry experiments.
This commit is contained in:
parent
952c371218
commit
7472f87e85
99
tests/rationalGeo.pl
Executable file
99
tests/rationalGeo.pl
Executable file
@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# Preexperiments to rational geometry
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Math::Trig;
|
||||
|
||||
# generate rational approximations to nth parts of an arc represented by sin and cos
|
||||
# approach leads to values in principal usable as first iteration, but has vastly to big numbers
|
||||
sub nthArc {
|
||||
my $n = shift;
|
||||
# basis triangle with half the angle
|
||||
my $prex = $n;
|
||||
my $prey = 1;
|
||||
dumpangles("pre", $prex, $prey, 45/$n);
|
||||
# complex multiplication, double the angle
|
||||
my $x = $prex*$prex - $prey*$prey;
|
||||
my $y = 2*$prex*$prey;
|
||||
dumpangles("square", $x, $y, 90/$n);
|
||||
my $npowx = 1;
|
||||
my $npowy = 0;
|
||||
for(1..$n) {
|
||||
my $nnpowx = $x*$npowx - $y*$npowy;
|
||||
my $nnpowy = $x*$npowy + $y*$npowx;
|
||||
$npowx = $nnpowx;
|
||||
$npowy = $nnpowy;
|
||||
}
|
||||
dumpangles("n-powered", $npowx, $npowy, 90);
|
||||
}
|
||||
|
||||
sub dumpangles {
|
||||
my ($name, $x, $y, $compare) = @_;
|
||||
my $goal = "";
|
||||
$goal = " (goal: $compare)" if $compare;;
|
||||
my $phi = atan2($y,$x)/pi*180;
|
||||
print "[$name] $x $y -- $phi$goal\n";
|
||||
}
|
||||
|
||||
# exp is
|
||||
# sum_n=0..inf x^n/n!
|
||||
|
||||
# 1/0! - x^2/2! + x^4/4! - x^6/6!
|
||||
sub preCos {
|
||||
my ($steps, $x) = @_;
|
||||
my $mxsq = -$x*$x;
|
||||
my $sum = 0;
|
||||
my $fa = 1;
|
||||
for(1..$steps) {
|
||||
my $step2 = $_ * 2;
|
||||
$sum += $fa;
|
||||
$fa *= $mxsq/($step2*($step2-1))
|
||||
}
|
||||
return $sum
|
||||
}
|
||||
|
||||
# x/1! - x^3/3! + x^5/5! - x^7/7!
|
||||
sub preSin {
|
||||
my ($steps, $x) = @_;
|
||||
my $mxsq = -$x*$x;
|
||||
my $sum = 0;
|
||||
my $fa = $x;
|
||||
for(1..$steps) {
|
||||
my $step2 = $_ * 2;
|
||||
$sum += $fa;
|
||||
$fa *= $mxsq/($step2*($step2+1))
|
||||
}
|
||||
return $sum
|
||||
}
|
||||
|
||||
|
||||
while(<>) {
|
||||
# if(m#^([1-9][0-9]*)$#) {
|
||||
# nthArc($1)
|
||||
# } else {
|
||||
# print "Bad parameter\n";
|
||||
# }
|
||||
if(m#^([1-9][0-9]*)\s+([0-9\.]+)$#) {
|
||||
my ($st, $x) = ($1, $2);
|
||||
my $c = cos($x);
|
||||
my $cappr = preCos($st, $x);
|
||||
print "$x -- c:$c cappr:$cappr\n";
|
||||
my $s = sin($x);
|
||||
my $sappr = preSin($st, $x);
|
||||
print "$x -- s:$s sappr:$sappr\n";
|
||||
} elsif(m#pi\s+([0-9]+)\s+([0-9]+)#) {
|
||||
my ($bigit, $smallit) = ($1, $2);
|
||||
my $pi = 22/7;
|
||||
for(1..$bigit) {
|
||||
$pi = $pi + preSin($smallit, $pi);
|
||||
}
|
||||
print "piappr: $pi -- truepu: ", pi, "\n"
|
||||
} else {
|
||||
print "Bad parameters\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user