решение экспоненциального уравнения в Раку - PullRequest
7 голосов
/ 06 апреля 2020

exponential equation

Я пытаюсь решить это экспоненциальное уравнение следующим образом:

my ($l,$r);

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

Но это не работает. Как решить это простым и понятным способом?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2020

Извините за двойной ответ.
Но здесь в 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 голосов
/ 06 апреля 2020

Для Perl 5 есть Math :: GSL :: Roots - Найти корни произвольных 1-D функций

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 для общего использования

...