Как решить математическое уравнение на языке программирования?

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

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

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

5 ответов


<?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;
}

?>

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


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

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


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

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

enter image description here

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

В конце концов у вас будет:

  +
 / \
n  -7

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

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


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

$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";
   }
}

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

это напоминает мне мой старый A. I. class =)

Удачи


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

var n = new Symbol("n");

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

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

n == 7