我需要帮助来解决这个公式((n * 2) + 10) / (n + 1) = 3
,最好是在 PHP 中。(数字 2、10 和 3 应该是可以更改的变量。)
我可以很容易地在纸上解出这个方程。但是,当我尝试在 PHP 中实现它时,我不确定从哪里开始。我在这里做了几个谷歌查询和搜索,似乎没有任何帮助。我错过了处理这个问题的正确方法。
任何提示和指示都会很棒,如果您提供确切的代码,请解释您是如何得到这个结果的。
我需要帮助来解决这个公式((n * 2) + 10) / (n + 1) = 3
,最好是在 PHP 中。(数字 2、10 和 3 应该是可以更改的变量。)
我可以很容易地在纸上解出这个方程。但是,当我尝试在 PHP 中实现它时,我不确定从哪里开始。我在这里做了几个谷歌查询和搜索,似乎没有任何帮助。我错过了处理这个问题的正确方法。
任何提示和指示都会很棒,如果您提供确切的代码,请解释您是如何得到这个结果的。
你想解决一个方程,而不是实现它。有区别。实现等式就像输入它一样简单。不过,您可能希望将其设为等式运算符 ( ==
)。
方程求解器是复杂的东西。当周围有这么好的(http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems )时,我不会尝试制作一个。
您可以使用http://pear.php.net/package/PHP_ParserGenerator/redirected将数学表达式解析为语法树,然后进行数学运算。
((n * 2) + 10) / (n + 1) = 3
看起来像:
这个想法是把...
所有的数字都放在右边的子树上(这里),把所有的未知数放在左边,就像你在纸上做的那样。
最后,您将拥有:
+
/ \
n -7
这是0。对于任何数学表达式(带有一个未知变量),您都有解决方案。
我会把算法留给你。
<?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;
}
?>
(我的代数很老而且很脆弱,但我认为这是正确的)
使用蛮力怎么样??!?!可能很慢且不准确:
$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 课 =)
祝你好运
以下是如何使用Symbolism计算机代数库在 C# 中求解该方程:
var n = new Symbol("n");
(((n * 2) + 10) / (n + 1) == 3)
.IsolateVariable(n)
.Disp();
执行该代码时,控制台上会显示以下内容:
n == 7