【发布时间】:2011-11-01 13:29:27
【问题描述】:
如果给定一个非线性方程系数数组和某个范围,我们如何在给定范围内找到该方程的根?
例如:等式是
所以系数数组将是 a 的数组。假设方程是
那么系数数组就是{ 1, -5, -9, 16 }。
正如谷歌所说,首先我们需要将给定的函数(实际上是方程)变形为其他函数。例如。如果给定的方程是y = f(x),我们应该定义其他函数,x = g(x),然后执行算法:
while (fabs(f(x)) > etha)
x = g(x);
找出根。
问题是:如何使用系数数组和仅给出的范围来定义g(x)?
问题是:当我这样定义g(x)时
或
对于给定的方程,x 的任何起始值都会引导我找到第二个方程的根。没有人会给我另外两个(根是{ -2.5, 1.18, 6.05 },我的代码只给1.18)。
我的代码是这样的:
float a[] = { 1.f, -5.f, -9.f, 16.f }, etha = 0.001f;
float f(float x)
{
return (a[0] * x * x * x) + (a[1] * x * x) + (a[2] * x) + a[3];
}
float phi(float x)
{
return (a[3] * -1.f) / ((a[0] * x * x) + (a[1] * x) + a[2]);
}
float iterationMethod(float a, float b)
{
float x = (a + b) / 2.f;
while (fabs(f(x)) > etha)
{
x = phi(x);
}
return x;
}
因此,调用iterationMethod() 传递范围{ -3, 0 }、{ 0, 3 } 和{ 3, 10 } 将提供三次1.18 号码。
我哪里错了,我应该如何做才能让它正常工作?
UPD1:我不需要任何第三方库。
UPD2:我需要“简单迭代”算法。
【问题讨论】:
-
Equation Solvers for C++ 的冗长重复
-
更新问题:只需要手工制作的“简单迭代”方法。没有任何第三方库。只是手工制作的一小段代码。
-
数值算法可能会有很大差异,具体取决于您使用的函数。你对输入函数了解多少?是多项式吗?它们是可区分的吗?一次?两次?
-
@Ernest Friedman-Hill: ???我看到的唯一相似之处是两者都在询问方程式..:/