在Raku中解决指数方程

8

指数方程

我正在尝试像这样解决这个指数方程:

my ($l,$r);

for (1 .. 100) -> $x {
    $l = $x * e ** $x;
    $r = 5 * (e ** $x - 1);
    say $x if $l == $r;
    }

但是它不起作用。如何以简明易懂的方式全面解决此问题?


1
区分这个方程,然后解二次方程。我不确定Raku是否可以直接帮助您。您是否期望Raku分析此代数表达式或为您提供数值解?您是在寻找现有的库还是想要自己编写程序?仅针对此特定方程吗? - Sebastian
3
尝试使用 Math::Symbolic(https://github.com/raydiak/Math-Symbolic)。看起来 .new.isolate 可能会解决问题。 - raiph
@Sebastian 我在想是否有一个简洁而优雅的解决方案。 - Lars Malmsteen
1
我认为目前在Raku中没有针对任何指数方程的通用解决方案。Math:: Symbolic将对数标记为NYI(尚未实现)。如果您不仅仅是出于兴趣而询问,而是需要解决此类方程或一组类似的方程,则可以手动执行第一步,然后让Raku完成其余步骤,这是可能的。然后您应该说明哪些内容可能会更改,例如哪些系数是可变的。如果您只需要解决此特定方程,则也可以在Raku之外进行解决(例如使用Wolfram Alpha)。 - Sebastian
2
你是在寻求代数解还是数值解? - Sebastian
显示剩余6条评论
2个回答

5

抱歉回答有些重复。
但这里是一种完全不同且更简单的方法,使用Raku解决了问题。
(它可能可以更加优雅地表达。)

#!/usr/bin/env raku

sub solver ($equ, $acc, $lower0, $upper0) {
    my Real $lower = $lower0;
    my Real $upper = $upper0;
    my Real $middle = ($lower + $upper) / 2;

    # zero must be in between
    sign($equ($lower)) != sign($equ($upper)) || die 'Bad interval!';

    for ^$acc {                                          # accuracy steps
        if sign($equ($lower)) != sign($equ($middle))
            { $upper = $middle }
        else
            { $lower = $middle }
        $middle = ($upper + $lower) / 2;
    }
    return $middle;
}

my $equ = -> $x { $x * e ** $x  -  5 * (e ** $x - 1) };  # left side - right side
my $acc = 64;                                            # 64 bit accuracy
my Real $lower = 1;                                      # start search here
my Real $upper = 100;                                    # end search here

my $solution = solver $equ, $acc, $lower, $upper;

say 'result is ', $solution;
say 'Inserted in equation calculates to ', $equ($solution), ' (hopefully nearly zero)'

2

对于Perl 5,有Math::GSL::Roots - 找到任意一维函数的根

https://metacpan.org/pod/Math::GSL::Roots

Raku支持使用Perl 5代码或直接访问GSL C库,对吗?

$fspec = sub {
       my ( $x ) = shift;

       # here the function has to be inserted in the format 
       # return leftside - rightside;

       return  ($x + $x**2) - 4;


     };

gsl_root_fsolver_alloc($T); # where T is the solver algorithm, see link for the 6 type constants, e.g. $$gsl_root_fsolver_brent
gsl_root_fsolver_set( $s, $fspec, $x_lower, $x_upper ); # [$x_lower; $x_upper] is search interval
gsl_root_fsolver_iterate($s);
gsl_root_fsolver_iterate($s);
gsl_root_fsolver_iterate($s);
gsl_root_fsolver_iterate($s);
gsl_root_fsolver_iterate($s);
my $result = gsl_root_fsolver_root($s);
gsl_root_fsolver_free (s);

如果函数的导数可用,可以使用增强算法(gsl_root_fdfsolver_*)。

有关一般用法,请参见https://www.gnu.org/software/gsl/doc/html/roots.html#examples


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接