10

我需要帮助来解决这个公式((n * 2) + 10) / (n + 1) = 3,最好是在 PHP 中。(数字 2、10 和 3 应该是可以更改的变量。)

我可以很容易地在纸上解出这个方程。但是,当我尝试在 PHP 中实现它时,我不确定从哪里开始。我在这里做了几个谷歌查询和搜索,似乎没有任何帮助。我错过了处理这个问题的正确方法。

任何提示和指示都会很棒,如果您提供确切的代码,请解释您是如何得到这个结果的。

4

5 回答 5

15

你想解决一个方程,而不是实现它。有区别。实现等式就像输入它一样简单。不过,您可能希望将其设为等式运算符 ( ==)。

方程求解器是复杂的东西。当周围有这么好的(http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems )时,我不会尝试制作一个。

于 2011-08-31T08:01:47.527 回答
8

您可以使用http://pear.php.net/package/PHP_ParserGenerator/redirected将数学表达式解析为语法树,然后进行数学运算。

((n * 2) + 10) / (n + 1) = 3看起来像:

在此处输入图像描述

这个想法是把...所有的数字都放在右边的子树上(这里),把所有的未知数放在左边,就像你在纸上做的那样。

最后,您将拥有:

  +
 / \
n  -7

这是0。对于任何数学表达式(带有一个未知变量),您都有解决方案。

我会把算法留给你。

于 2011-08-31T08:13:35.577 回答
4
<?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;
}

?>

(我的代数很老而且很脆弱,但我认为这是正确的)

于 2011-08-31T08:13:09.770 回答
3

使用蛮力怎么样??!?!可能很慢且不准确:

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

您可以改进这个答案..在每个循环上,您都可以计算当前答案和所需答案之间的距离,并据此调整参数..

这让我想起了我以前的 AI 课 =)

祝你好运

于 2011-08-31T08:19:28.287 回答
0

以下是如何使用Symbolism计算机代数库在 C# 中求解该方程:

var n = new Symbol("n");

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

执行该代码时,控制台上会显示以下内容:

n == 7
于 2015-10-27T03:36:00.810 回答