Math-PlanePath
view release on metacpan or search on metacpan
devel/theodorus.pl view on Meta::CPAN
# ...
# (-1)^m*Bm (m-1) (m-1)
# + --------- * (f (n) - f (1))
# m!
# ...
# B0=1
# B1=-1/2
my $B2 = 1/6;
my $B3 = 0;
my $B4 = -1/30;
# f(x) = arctan 1/sqrt(x)
# f'(x) = 1/(1+x^2)
# f'2(x) = (-1 * (2 * x)) / (((x ^ 2) + 1) ^ 2)
# = -2x / (x^2 + 1)^2
foreach my $x (1 .. 40) {
my $sum = fsum($x);
my $ifx = ifx($x) - ifx(1) - (fx($x)-fx(1))/2;
my $t1 = $B2/2 * (dfx($x) - dfx(1));
my $if2 = $ifx + $t1;
printf "%.4f %.4f[%.4f] %.4f[%.4f]\n",
$sum, $ifx, $ifx-$sum, $if2, $if2-$sum;
}
sub ifx {
my ($x) = @_;
return sqrt($x) + $x*fx($x) - atan2($x,1);
}
sub fx {
my ($x) = @_;
return atan2(1, sqrt($x));
}
sub dfx {
my ($x) = @_;
return 1/($x*$x+1);
}
sub ddfx {
my ($x) = @_;
return -2*$x/(($x*$x+1)**2);
}
sub fsum {
my ($x) = @_;
my $ret = 0;
foreach my $i (1 .. $x-1) {
$ret += fx($x);
}
return $ret;
}
exit 0;
}
{
{
package Math::Symbolic::Custom::MySimplification;
use base 'Math::Symbolic::Custom::Simplification';
# use Math::Symbolic::Custom::Pattern;
# my $formula = Math::Symbolic->parse_from_string("TREE_a * (TREE_b / TREE_c)");
# my $pattern = Math::Symbolic::Custom::Pattern->new($formula);
use Math::Symbolic::Custom::Transformation;
my $trafo = Math::Symbolic::Custom::Transformation::Group->new
(',',
'TREE_a * (TREE_b / TREE_c)' => '(TREE_a * TREE_b) / TREE_c',
'TREE_a * (TREE_b + TREE_c)' => 'TREE_a * TREE_b + TREE_a * TREE_c',
'(TREE_b + TREE_c) * TREE_a' => 'TREE_b * TREE_a + TREE_c * TREE_a',
# '(TREE_a / TREE_b) / TREE_c' => 'TREE_a / (TREE_b * TREE_c)',
'(TREE_a / TREE_b) / (TREE_c / TREE_d)'
=> '(TREE_a * TREE_d) / (TREE_b * TREE_c)',
'1 - TREE_a / TREE_b' => '(TREE_b - TREE_a) / TREE_b',
'TREE_a / TREE_b + TREE_c' => '(TREE_a + TREE_b * TREE_c) / TREE_b',
'(TREE_a / TREE_b) * TREE_c' => '(TREE_a * TREE_c) / TREE_b',
'TREE_a - (TREE_b + TREE_c)' => 'TREE_a - TREE_b - TREE_c',
'(TREE_a - TREE_b) - TREE_c' => 'TREE_a - TREE_b - TREE_c',
);
sub simplify {
my $tree = shift;
### simplify(): "$tree"
### traf: ($trafo->apply_recursive($tree)//'').''
return $trafo->apply_recursive($tree) || $tree;
# if (my $m = $pattern->match($tree)) {
# $m = $m->{'trees'};
# ### trees: $m
# ### return: ($m->{'a'} * $m->{'b'}) / $m->{'c'}
# return ($m->{'a'} * $m->{'b'}) / $m->{'c'};
# } else {
# ### no match
# return $tree;
# }
}
__PACKAGE__->register();
}
require Math::Symbolic;
require Math::Symbolic::Derivative;
{
my $t = Math::Symbolic->parse_from_string('1/(x^2+1)');
$t = Math::Symbolic::Derivative::total_derivative($t, 'x');
$t = $t->simplify;
print "$t\n";
exit 0;
}
{
my $a = Math::Symbolic->parse_from_string(
'(x+y)/(1-x*y)'
);
my $z = Math::Symbolic->parse_from_string(
'z'
( run in 0.906 second using v1.01-cache-2.11-cpan-df04353d9ac )