- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我编写了牛顿拉夫森求根算法的简单实现,它采用初始猜测 init
、一元函数 f
和公差 tol
作为参数,如下所示:
bool newton_raphson(double& init,
double(*f)(double),
double tol){
const int max_iter = 10000;
double next_x, soln = init;
int i = 0;
while(++i < max_iter){
next_x = soln - f(soln)/fp_x(f, soln);
if(fabs(next_x - soln) < tol){
init = next_x;
return true;
}
soln = next_x;
}
return false;
}
double fp_x(double(*f)(double),
double x){
const double h = 0.000001;
return (f(x + h) - f(x - h))/2.0/h;
}
我的问题是:虽然这对于一元函数来说工作得很好,但我想更改实现,以便它适用于具有多个参数的函数 f
,但除一个参数外,所有参数都有常数值。澄清一下:如果我有一个函数 f(x) = 3x + 2,如下所示
double f(double x){
return (3*x + 2);
}
然后我的实现工作。但是,我也希望它适用于具有任何给定数量参数的任何函数,但只有第一个参数是可变的。所以,如果我有一个函数 f(x,y) = 3x + 2y
double f(double x, double y){
return (3*x + 2*y);
}
我想使用相同的函数求 f(x,2) 或 f(x,3) 的根,等等 n 个参数,而不仅仅是一个或两个(请忽略函数我在例子中展示的是简单的线性函数,这只是一个例子)。有什么方法可以为不同数量的参数实现该函数,还是我必须为每种情况编写一个实现?
谢谢,
NAX
注意
正如您现在所知道的,这个问题并不是真正关于 newton-raphson 的,但是如果我将它用作实际问题的示例,它会变得更容易,它是具有不同数量参数的函数的单一实现.
更新
下面的一些答案使用std::bind
和std::function
来解决问题,这实际上比选择的答案更能解决我的问题;然而,它们是 C++11 库类/函数(不要误会我的意思,我强烈敦促每个 C++ 程序员继续学习)并且在撰写本文时,我遇到了一些问题使用它们;使用 g++ 4.7(兼容 c++11)的 Eclipse Juno 仍然无法识别 std::function
,因此我决定继续使用下面的检查答案,它也很好用。
最佳答案
我认为您要求的是可变函数:
A variadic function – a function declared with a parameter list ending with ellipsis (...) – can accept a varying number of arguments of differing types. Variadic functions are flexible, but they are also hazardous. The compiler can't verify that a given call to a variadic function passes an appropriate number of arguments or that those arguments have appropriate types. Consequently, a runtime call to a variadic function that passes inappropriate arguments yields undefined behavior. Such undefined behavior could be exploited to run arbitrary code. From here:
但是,如上所述,它们存在许多问题。
最值得注意的是,它只适用于编译时!
但是,如果您有兴趣实现一个,这里有一篇文章有一个很好的例子:
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=138
更新:
IMO,我认为您最好定义采用结构或对象参数的函数(即通用函数对象),然后编写显式处理这些参数的函数。
另一种选择是在编译时执行一些操作 reflection - 这很有用,但在这样的例子中做起来太麻烦了。另外,C++ 中的“反射”并不是“真正的”反射,而是一种糟糕且不完整的实现。
关于C++:newton raphson 和重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15469800/
我有以下代码将尝试求解多项式系统: require "bigdecimal" require "bigdecimal/newton" include Newton class Function a
我的任务是在10E-7的误差范围内使用Newton Raphson和二分法找到函数的根。 总而言之,我们了解到牛顿拉夫森法更快,更有效。 现在由于某种原因,我得出相反的结果。尽管我知道这两种方法中对根
好的,这段代码在另一个问题中,但我不知道如何添加更新的代码。我让这段代码正常工作并给出了正确的答案,但根据我的 while 循环条件它并没有停止。我不确定我在那里做错了什么?答案明显收敛,所有值都是正
我是这个主题的新手,找不到原因:程序有时有效,有时无效(问完问题后,它根本不想接受我的答案,而我可以我想写多少就写多少,它没有反应,只是列出数字,我给了小费) #include float ab
我警告你,这可能会造成混淆,而且我编写的代码与其说是完成的代码,不如说是思维导图。 我正在尝试实现 Newton-Raphson 方法来求解方程。我想不通的是如何写这个 Python 中的方程,用于根
在下面的代码中,当我选择例如“max_n_iterations”等于 1 时,列表“approximations”在打印时显示两个元素,而它应该只显示一个元素(初始 x)。 这是什么原因? #This
我正在尝试使用 Newton Raphson 方法找到 N 个根。这是我对相同的实现... double derive(int guess, int m, int n) { return gues
我有一个大问题。我需要用 C++ 函数或类求解 3 个变量的 3 个方程的非线性系统。我考虑过使用 Newton-Raphson 方法来执行解决方案。不幸的是,我没有找到可以为我做到这一点的源代码。会
问题的简要说明:我使用 Newton Raphson 算法在多项式中求根,但在某些情况下不起作用。为什么? 我从“c++ 中的数值食谱”中获取了一种 Newton Raphson 混合算法,该算法会在
我编写了牛顿拉夫森求根算法的简单实现,它采用初始猜测 init、一元函数 f 和公差 tol 作为参数,如下所示: bool newton_raphson(double& init,
我正在尝试在 R 中使用 Newton-Raphson 算法来最小化我为一个非常具体的问题编写的对数似然函数。老实说,估计方法超出了我的能力范围,但我知道我的领域(心理测量学)中有很多人使用 NR 算
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
public class Sqrt { public static void main(String[] args) { double EPS = 1
实际上,我正在使用用于 Android 的 xamarin studio 和用于 webService 的 IOS 开发我的应用程序,我在 Android 和 IOS 中分别包含了一个单独的项目。 我
我在一个简单的程序中工作,该程序使用 Newton-Raphson 方法计算任何给定函数的根。在这个程序中,我必须打印找到的根和进行的迭代次数。程序本身很好,我可以找到任何给定函数的根,但我无法正确计
x=float(raw_input('Enter a number to show its square root')) precise = 0.01 g=x/2.0 while abs(g**2-x
我正在尝试使用 scipy.optimize.newton_krylov() 来解决最小二乘优化问题,即找到 x 使得 (Ax - b)**2 = 0。我的理解是 A 必须是 mxn m>n,b 必须
我注意到,当我序列化具有 HTTP_VERB 键的 C# 字典时,它在 JSON 结构中变成了 httP_VERB 而不是 hTTP_VERB 或 http_verb 我希望驼峰式大小写能够成功。 这
我在 Newton-Raphson 迭代的脚本中收到 'float' object is not Iterable 错误。我将迭代应用于函数 f(x) = sin(x),并将 x0 = 3 应用于迭代
string result ="{"AppointmentID":463236,"Message":"Successfully Appointment Booked","Success":true,
我是一名优秀的程序员,十分优秀!