BISECTION是一种快速、简单、健壮的根查找方法,用于处理n维数组。
额外的可选输入和输出,用于更多的控制和功能,这在其他平分方法或其他根查找函数(如fzero)的实现中不存在。
这个函数在需要在一个循环中实现fzero以解决多个情况的情况下非常出色,在这种情况下它会更快。
它可以找到零根或非零根。
这段代码可能有点晦涩难懂。这是为了提高速度和能力。请参阅许多公认的其他提交的更简单、更容易遵循的实现,以理解二分法的基础知识。
天空缝匠肌(2021)。二分法求根GitHub (https://github.com/sky-s/bisection)。检索.
一个非常好的代码,但我想知道它是否能解耦合非线性方程,比如x(1)^2-x(2)^2+3*x(3)-5=0, x(1)^2+x(3)^2-4*x(1)*x(2)*x(3)+89=0, x(1)*x(2)-x(3)^3-23=0
Alex提出的问题现在被解决了。谢谢你,亚历克斯!
Muhtesem bir dosya……Emegi gecen herkesin amk…
嗨,亚历克斯,
谢谢你的建议。我将考虑在每次迭代中去除额外的函数求值。我也把二分法放在了GitHub上,如果你想在那里做贡献。
最好改变第一行,澄清函数满足其中一个目标函数,而不是同时满足(或和)
也行167:outsideolx = (ub - lb) > tolX;
outsideolx = (x - lb) > tolX;
这很好,不过还有一些优化的空间。目前,函数f在每次迭代中被调用两次,只需要调用一次。
你可以用下面的代码替换主循环来加快速度(你也可以移除可选翻转ub和lb的部分):
lb_sign =符号(f(磅));
而真正的
X = (lb + ub) / 2;
fx = f (x);
conX = abs(ub - x) < tolX;
conFun = abs(fx) < tolFun;
con = conX | conFun;
如果所有(con (:))
打破;
结束
Select = sign(fx) == lb_sign;
磅(选择)= x(选择);
乌兰巴托(~选择)= x(~选择);
结束
tbaracu:这个函数至少需要三个输入,例如平分(@cos,-3,3)。
它不工作:
> >对分
输入参数不足。
平分误差(第115行)
ub_in =乌兰巴托;lb_in =磅;
伟大的功能! !
如果在间隔中有几个根,它会发现第一个只对LB关闭吗?
很棒的程序,节省了我很多时间,谢谢!
矢量化特性非常非常有用。我对必须在for循环中输入f0感到烦恼。
对我来说很有效。将循环替换为大约100万次迭代,可将执行时间缩短几个数量级。
此外,它编写得很好,文档记录得很好,是一种数字健壮的方法。
优秀的文件。比在长循环中使用fzero快得多!
谢谢!我自己也有一个类似的档案,但你的更好!
我很高兴我发现了这个提交,我非常感谢作者提供了一个优秀的,良好的文档化的代码。我在for循环中调用了我的定制Newton-Raphson算法(带有分析梯度)数千次。我用对bisection的一次调用代替了这个循环。M,并实现了15倍的加速度!太棒了。
我刚刚上传了一个全新的功能,包含了几乎所有的新代码和文档,以及许多新功能。有这么多的新代码,请让我知道,如果你发现一个错误。
这是我对这个函数的极限。我希望看到MathWorks或社区中的其他人开发Brent方法的矢量化实现,即使FZERO矢量化,以便能够处理数组问题。一个矢量化的FZERO(带有TolFun特性)在各方面都比这个要好。
在第80行似乎有一个打印错误:
物= f(乌兰巴托+磅)/ 2;测试f是否返回多个输出
它应该是
f((乌兰巴托+磅)/ 2)
具有示例的优秀文档。简单的功能,工作如广告。