如何在编程语言中解决数学方程?

10

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

我能够在纸上很容易地解决这个方程。但是,在尝试在PHP中实现时,我不知道从哪里开始。我已经做了几次 Google 查询和搜索,但仍然没有找到正确的方法来处理这个问题。

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


你需要实现只有这一个方程,还是同类的所有方程? - Benjamin Crouzier
你可以重新表达这个方程吗? - Deve
2
有专门用于公式转换/方程求解的语言。PHP不适合这种用途,因为科学应用不是它的主要领域。但你可以在Python或Perl中找到相关工具(然后通过exec调用)。 - mario
@Deve 是的,我可以重新表达这个方程式。 - xidew
@xidew,请检查我的答案,现在我考虑了你的新要求。 - Benjamin Crouzier
显示剩余5条评论
5个回答

15

你想要解决一个方程,而不是实现它。这是有区别的。实现方程只需要将其键入即可。但你可能想将其作为等式运算符(==)。

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


你想解决一个方程,而不是实现它。哦,我真希望我可以多次点赞这个... - user554546
感谢您指出正确的术语。我会编辑问题 :) - xidew
phpCAS并不是你想象的意思。 - mario

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

((n * 2) + 10) / (n + 1) = 3会被解析为:

enter image description here

思路是将所有数字移到右子树(这里是...),将所有未知数移到左子树,就像在纸上做的那样。

最终您将得到:

  +
 / \
n  -7

结果为0。这就是您解决任何数学表达式(带一个未知变量)的方法。

算法由您自己完成。


非常有趣,我会去看看 :) - xidew
你如何将所有数字移动到右侧?你能给我们举个例子吗?谢谢! - Carlos

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

?>

我的代数有点老旧,可能有点过时,但我认为这是正确的。


你的函数运行正常!您能否解释一下在编写/思考时您的思维过程是什么? - xidew
你的函数在数学上是错误的。你缺少了 $y == $x && $z == $x 这种情况。在这种情况下,集合 R - { 1 } 是方程的解。 - Benjamin Crouzier
我的退路是我的代数知识已经老旧且不太常用。主要的事情是检查是否存在除以0的情况(因此需要检查Z<>X)。我解决问题的思路是将方程转化为“x*n=c”的形式(即使x是一个分数也可以)。一旦它被转化成这种形式,解决方案就是将方程简单地重写为PHP代码。 - DaveyBoy
@pinouchon - 显然,可以为特殊情况添加更多检查。但是,我是一名程序员而不是数学家,所以我的警告仍然有效 - 我的代数知识又老又薄弱,但我认为这是正确的。 - DaveyBoy
@DaveWilsonLAMP,请检查我的答案,其中所有特殊情况都已处理。不处理特殊情况的缺点是,在某些情况下,你的答案就是错误的,例如eq(0,0,0)eq(1,1,1)eq(0,0,1)eq(1,1,2)... - Benjamin Crouzier
显示剩余4条评论

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

你可以改进这个答案...在每次循环中,你可以计算当前答案与所需答案之间的距离,并根据此调整参数。
这让我想起了我的旧人工智能课程 =)
祝好运!

3
那是一个解决方案,但我正在寻找正确的方法来解决它。不过还是谢谢你的回答! - xidew

0

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

var n = new Symbol("n");

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

当执行该代码时,控制台会显示以下内容:
n == 7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接