在编程中实现数学方程式遇到问题

11
我正在为学校实现一个算法,但在理解如何在编程中表示定积分方面遇到了问题。例如,我知道求和公式可以实现为以下示例:
enter image description here

假设y=f(x)

if(x==0){
    y=x+1;
}else{
    for(int i = 0; i < n; i++){
        y = y + (x - 1);
    }
}
我应该如何表示一个数值积分,例如:
enter image description here
这里提供的方程可能没有数学意义,但我的目标是在C#中实现类似的方程,以用于我必须实现包含积分的算法的学校编程项目。我一直在阅读有关使用数值方法(例如辛普森规则)来解决定积分的文章;我是否需要使用这些方法来实现方程,或者可以使用类似循环等的编程方式来表示积分呢?

所以,你想要一个公式解析器吗?还是你想学习如何将数学公式转换为代码? - SQLMason
我真的无法相信这个问题得到了+7的评分。作为一名工程师,我曾经经常做这种自动化工程流程的事情。我不明白这有什么大不了的。这里没有什么魔法。 - SQLMason
2
@DanAndrews 读一下加一到底意味着什么。表现出努力了吗?我会这么说,对于一个初学者来说这是一个很好的问题!有用吗?你自己都这么说了,你经常需要使用它,所以应该是一个有用的领域。清晰易懂吗?是的。那为什么不用 +1 呢? - weston
@weston 我不想就这个问题进行辩论。看看这个问题的答案。很明显,这个问题不够清晰或具体,无法回答。+1是因为OP使用了漂亮的格式吗?真的吗?这是第一个不是问题的问题。 - SQLMason
@DanAndrews +1 因为我也很想知道答案。 - Pacane
显示剩余2条评论
4个回答

1

数值积分的主题很广,可以变得非常复杂,因此我不会在这个答案中涵盖所有内容。

Simpson's规则是一种用于数值积分的方法,朝着简单和近似的方向(而不是复杂、准确或两者兼备的方向)。对于您开始研究该主题来说,这并不是一个坏选择,因为它非常容易理解和编程。我毫不怀疑,您可以直接在您喜欢的编程语言中实现维基百科上提供的公式

现在,将循环和Simpson's规则结合起来:Simpson's规则对积分真实值的近似精度随着积分限制(例如您的示例中的3和20)越来越接近而得到改善。因此,您可以采取的一种方法是编写一个循环,计算从3到4,从4到5等的积分,并在最后将它们全部加起来。积分产生区域,将区域相加产生(通常是)另一个更大的区域。

对于所有数值积分方面的专家,我知道还有其他方法,并且其中许多方法在许多不同意义上都更好,我也知道辛普森规则会在某些(很多)函数上遇到麻烦,但这并不是一个坏的起点。


1
也许我没理解清楚,您是想知道如何进行数值积分吗?
如果是这样,有很多方法。简单介绍请参考:http://en.wikipedia.org/wiki/Numerical_integration 从您的示例中,您可以简单地执行以下操作:
int f(int x) {
    if(x == 0) {
       y = x + 1;
    }else{ 
      y = computeIntegral()
    }
    return y
}

这里,computeIntegral() 是一个你必须编写以计算积分的函数。

但我认为你的函数 f(x) 存在问题,因为如果 x 不为零,则 f(x) 只有一个值。也许积分边界应该取决于 x?

最后一条评论。如果 x 是浮点数,则不建议使用 x == 0,因为由于舍入截断,浮点数没有唯一的二进制表示。


我知道这个方程没有意义,它们只是我在Word中制作的两个图像,以便大致了解我想要做什么,但我的目标是找出如何表示一个积分,而不一定是那个积分的代码。从我的理解来看,我需要使用数值方法计算积分,如果我没有误解你的话。 - user1327159
IEEE f-p标准要求+0和-0相等,因此它们具有不同的表示并不意味着x==0.0是无效(或麻烦)的操作。这与“舍入截断”无关。 - High Performance Mark
@HighPerformanceMark 对于 x == 0 是可以的,但通常来说使用 == 来比较两个浮点数是否相等是有意义的吗? - Ger
1
如果您想通过程序计算积分,则必须使用数值方法或者像Bob Vale刚才所说的那样,如果您知道原函数的值,则计算它的值。 - Ger

1

这取决于你想要做什么。如果这是一个具体的实现,你可以简单地集成公式x-1变成(x^2)/2 - x,然后返回最大值减去最小值。

或者,它可以作为一个估计来实现,选择适当的dx步长。

decimal dx=0.1;

if(x==0){  
    y=x+1;  // could just return y=1
}else{  
    decimal tempY=0;
    for(decimal i = 3; i <= 20; i+=dx){  
        tempY += (i - 1);  
    }  
    // Either return tempY as decimal or
    y= Convert.ToInt32(tempY);
}  

0

你不能仅通过循环来表示一个积分,因为积分是无限和。你必须使用近似方法或修改方程式以消除积分符号。你第二个方程中的积分应该很容易消除。


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