返回首页


简介
本文会谈约在一维根发现。它讨论的一些算法可以解决的问题,F(X)= 0,其中f是一个给定的函数,x是一个真正的变量。背景
许多算法可以在互联网上找到他们的源代码。这里是我的工作只是翻译他们在C#中,有时对它们进行修改了一下,基本上嵌入到一个方便的框架内,一拉,C STL。关于求根
怎能计算机解决一个像F(X)= 0的方程?正如你能想象,根发现算法不"解决"方程。他们"只"提供(在最好的情况下)一个近似的解决方案,采用迭代方法。一个给定的时间间隔,即假定包含的解决方案开始,algorihtm减少至少2(使用二分法),在每一次迭代的时间间隔的长度。它停止时,余下的时间间隔的长度达到预先定义的值(精度)。
基本上,这工作得很好。但它可以发生,不能达到的准确性。为了防止无限迭代的算法,你应该想停止它,当迭代次数达到一定值(称为迭代)。
现在,你几乎可以使用的代码。但您应该感兴趣的一个专项整治。假如你不知道你正在使用的函数f。你怎么能确定的范围内,该算法已开始?在这种情况下,你必须使用OutwardBracketing。鉴于不断增长的因素,该算法将迭代增长的初始范围,直到函数f改变其标志之间的范围界限。请注意,因为f应该是连续的,这确保了一个解决方案在于在成长的时间间隔。使用代码
使用该库是很容易的。该库提供了六种方法,其中最常见的。每一个被嵌入在一个类中,这本身从抽象RootFinder类继承一样,它是在画面上显示:

你的工作最困难的是要选择好方法。这将在后面讨论。假设你要解决的方程f(x)= 0,其中f是这样定义:私人双F(双X){   ; 返回3X * X - 1; }
这两个解决方案在于在区间[-1 1]。假设您想要的正根。不要忘了该算法提供了一个独特的解决方案。如果您选择一个太大的出发时间间隔,算法可能会出问题,或给你的解决方案,你不想。所以,你开始像区间[0,1]。私人双FindRoot(双X){  0; / /创建求根对象,包含算法   ; BisectionRootFinder取景器= &# 160; 新BisectionRootFinder(新UnaryFunction(F)); / /定义你想要的准确性,为根 finder.Accuracy = 1.0E - 04; / /防止溢出 finder.Iterations = 30; & #160; / /计算无包围向外 双根= finder.Solve(0.0,1.0,FALSE); 返回根; }
f的根R [0,1]是R = SQRT(1 / 3)。确保您的准确性近似根r"的算法提供验证:ABS(R' - R)<10E - 4(精度)除非该算法达到最大迭代,你通过它(这里30)。
您选择哪种算法?
如果你有一个衍生功能的F DF的表达,使用Newton - Raphson方法。它的稳定和迅速收敛。如果你没有表达DF衍生功能的F,答案是不容易的。事实上,这取决于对什么是您最重要的。二分法将始终引领你到一个很好的近似,但不尽快别人。这三种方法假位置,正割, 和里德衔接更迅速,但在某些情况下可能会失败。布伦特方法似乎是最有效的方法。兴趣点
算法的源代码,可以发现在互联网上到处。在C#中,建立一个一维的功能框架是不容易的。在C中,你可以创建模板类的仿函数和算术运算符。在C#中,你不能。好吧,处理函数指针是很容易与代表的,但仅此而已。那么,怎样才能建立一个高效的框架在C#中的职能?说实话,我认为这是不可能的。这是我之所以不提供这样一个框架。创建一个抽象类的功能,并从中获得它需要的是不necessarilynbsp; thenbsp;解决方案。我建议在下载的软件包是一个静态类,名为"功能,可以帮助您处理功能:此外,减法,和组成。
在demo包,你会发现一个数学公式解析器。最初的想法和代码来自马尔辛Cuprjak

回答

评论会员:markol80 时间:2011/12/07
的代码是非常有用的,直观的的,但让我问你:
我唯一​​的人谁也不能成功地使牛顿法工作?
我所看到的牛顿法是从名单​​上删除的代码,所以我重新插入它,但它不工作(总是说坏的区间范围)...
谢谢你

p.s.可能需要calculare衍生
评论会员:??崖斯坦福 时间:2011/12/07
了很少的时间,从双转换为十进制,并解决了一个真实worlld的问题

感谢
评论会员:。MichaelRice 时间:2011/12/07
有趣的文章!但我想知道如何,RootFinder类等图呢?

评论会员:bsargos 时间:2011/12/07
?对不起迈克尔,柏迪我不明白你的问题 请问你需要什么?
评论会员:Coskun大羽 时间:2011/12/07
文章感谢。这是非常好的。

我是即将开始实施的这些对我的项目在SourceForge上:http://sourceforge.net/projects/scinet/

你的工作会来救我重新实现这些算法。
生命是什么发生在你身上,而你是忙于编程。