1 (изменено: Yury, 2016-10-01 01:09:14)

Тема: PERL: Как "вытянуть" математические формулы?

Здравствуйте, в PERL я не очень опознан, но не удается мне "вытянуть" математические формули с кода(200 строк).
Вот наисложнейшая для меня часть кода которую я не могу понять.

+ открыть спойлер

sub kelly {
	my $mrg = 0.99999;
	my $mrg2 = 0.99999;
	my $aline = $_[2];
	my $gline = $_[4];
	my $raline = $aline < 0 ? int($aline-0.3) : int($aline+0.3);
	my $rgline = int($gline+0.3);
	my @p = two($_[0], $_[1], $raline, $rgline);
        my @f = ();
	my ($stop, $rem, $t, $u, $n, $i, $ulog, $bu);
	my $index = 0;
	my ($sta, $sto, $reta, $reto);
my @o = (
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
);
#print "@p\n";
@o[0] = [afill1($aline-$raline,$_[3]*$mrg)];
@o[1] = [afill2($aline-$raline,$_[3]/($_[3]-1)*$mrg)];
@o[2] = [gfill1($gline-$rgline,$_[5]*$mrg2)];
@o[3] = [gfill2($gline-$rgline,$_[5]/($_[5]-1)*$mrg2)];
#print "$o[0][0] $o[0][1] $o[0][2] $o[0][3] $o[0][4] $o[0][5] $o[0][6] $o[0][7] $o[0][8]\n";
#print "$o[2][0] $o[2][1] $o[2][2] $o[2][3] $o[2][4] $o[2][5] $o[2][6] $o[2][7] $o[2][8]\n";
while (!$stop) {
        $rem = -1;
        for ($t = 0; $t < 5; $t++) {
                $f[$t] += 0.001;
                for ($u = 0, $n = 0; $n < @p; $n++) {
                        $ulog=0;
                        for ($i = 0; $i < 5; $i++) {
                                $ulog += $f[$i]*($o[$i][$n]-1);
                        }
#print "n,u,ulog:$n $u $ulog\n";
			$ulog = -0.999 if ($ulog < -0.999);
                        $u += $p[$n]*log(1+$ulog);
                }
                if ($u > $bu+0.000001) {
                        $rem=$t;
                        $bu = $u;
                }
                $f[$t] -= 0.001;
        }
        if ($rem >= 0) {
                $f[$rem] += 0.001;
        } else {
                $stop = 1;
        }
#       printf "%.4f %.3f %.3f %.3f %.3f\n", $bu, $f[0], $f[1], $f[2],$f[3];
}
        printf "%.4f %.3f %.3f %.3f %.3f\n", $bu, $f[0],$f[1],$f[2],$f[3];
#       print "$bu @f\n";
	$sta = $f[0] + $f[1];
	$sto = $f[2] + $f[3];
	$reta = -$sta;
	$reto = -$sto;
	if ($_[6] + $raline == $_[7]) {
		$index += 3;
	} elsif ($_[6] + $raline < $_[7]) {
		$index +=6;
	}
	if ($_[6]+$_[7] == $rgline) {
		$index++;
	} elsif ($_[6]+$_[7] < $rgline) {
		$index+=2;
	}
	for ($i = 0; $i < 2; $i++) {
		$reta += $f[$i]*$o[$i][$index];
	}
	for ($i = 2; $i < 4; $i++) {
		$reto += $f[$i]*$o[$i][$index];
	}
		
	return ($sta, $sto, $reta, $reto);
}

Почему мне это нужно?
Я не могу понять связь введенных цифр с конечным результатом, а именно последние 4 цифры с 13.
Если кто желает помочь разобрать целый код то могу предложить вознаграждение.

2

Re: PERL: Как "вытянуть" математические формулы?

niceice пишет:

Если кто желает помочь разобрать целый код то могу предложить вознаграждение.

Если подобный интерес возникнет, пожалуйте с этим уже в коммерческий раздел.

3

Re: PERL: Как "вытянуть" математические формулы?

Flasher, да думаю никто даже не поможет, не то что бы за вознаграждение делать. (:

4

Re: PERL: Как "вытянуть" математические формулы?

niceice
perl форум в гугл вбейте и вперёд.

5

Re: PERL: Как "вытянуть" математические формулы?

Flasher, почитав правила, понял что вопрос не пропустят. Или ответят:  "учи сам". Фриланс как вариант, но я не знаю цены и будет большая вероятность что меня обманут.

6

Re: PERL: Как "вытянуть" математические формулы?

niceice
При правильном оформлении пропустят. И вообще я предложил воспользоваться профильными Perl-(под)форумами. Создайте свой запрос на них и мониторьте ответы.