Как решить математическое уравнение на языке программирования? - PullRequest
8 голосов
/ 31 августа 2011

Мне нужна помощь, чтобы решить эту формулу ((n * 2) + 10) / (n + 1) = 3, желательно на PHP. (Числа 2, 10 и 3 должны быть переменными, которые могут быть изменены.)

Я могу решить это уравнение на бумаге довольно легко. Однако, когда я пытаюсь реализовать это в PHP, я не уверен, с чего начать. Я сделал несколько запросов Google и поисков здесь, и ничто, кажется, не помогает. Мне не хватает правильного подхода к решению этой проблемы.

Любые советы и указатели были бы хорошими, и если вы предоставите точный код, пожалуйста, объясните, как вы достигли этого результата.

Ответы [ 5 ]

15 голосов
/ 31 августа 2011

Вы хотите решить уравнение, а не реализовать это.Есть разницаРеализовать уравнение так же просто, как набрать его. Возможно, вы захотите сделать его оператором равенства (==).

Решатели уравнений - это сложные, сложные вещи.Я бы не стал делать такой, когда вокруг лежат такие хорошие (http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems).

5 голосов
/ 31 августа 2011

Вы можете использовать http://pear.php.net/package/PHP_ParserGenerator/redirected для анализа математических выражений в синтаксическом дереве, а затем выполнять математические вычисления.

((n * 2) + 10) / (n + 1) = 3 будет выглядеть так:

enter image description here

Идея состоит в том, чтобы вывести в правом поддереве (здесь ...) все числа, а слева все неизвестные, как вы это сделали бы на бумаге.

В итоге у вас будет:

  +
 / \
n  -7

, что равно 0. И у вас есть решение для любого математического выражения (с одной неизвестной переменной).

Я оставлю вам алгоритм.

4 голосов
/ 31 августа 2011
<?php

// ((x * n) + y)/(n + 1) = z)
// => n=(y-z)/(z-x)
function eq ($x=0,$y=0,$z=0)
{
    if ($z!=$x)
    {
        $n=($y-$z)/($z-$x);
    } else
    {
        $n='NAN';
    }
    return $n;
}

?>

(Моя алгебра старая и ненадежная, но я думаю, что это правильно)

2 голосов
/ 31 августа 2011

как насчет использования грубой силы ??!?! может быть медленным и не точным:

$step = 0.00001;
$err = 0.1; //error margin
$start = 0;
$response = 3;

for($i = $start;$i <= 3;$i += $step){
   if((($i * 2) + 10) / ($i + 1) >= $response - $err){
       echo "the answer is $i";
   }
}

Вы можете импровизировать этот ответ .. в каждом цикле вы можете рассчитать расстояние между текущим ответом и желаемым ответом и настроить параметры в соответствии с этим ..

Это напоминает мне мой старый А.И. класс =)

Удачи

0 голосов
/ 27 октября 2015

Вот как решить это уравнение в C # с библиотекой компьютерной алгебры Symbolism :

var n = new Symbol("n");

(((n * 2) + 10) / (n + 1) == 3)
    .IsolateVariable(n)
    .Disp();

При выполнении этого кода на консоли отображается следующее:

n == 7
...