我试图找到这样的p,对于给定的函数f(p),我们有相等
P = F(P); 这是代码
#include <iostream>
#include<math.h>
using namespace std;
float fixed(float x){
return (float)(pow(x,3)-4*pow(x,2)-10);
}
int main(){
float p=0.0;
float p0=1.5;
float tol=(float).001;
int N=25;
int i=1;
while(i<N){
p=(float)fixed(p0);
if((p-p0)<tol){
cout<<p<<endl;
break;
}
i=i+1;
p0=p;
if(i>N){
cout<<"solution not found ";
break;
}
}
return 0;
}
我尝试了不同的初始点,也有不同的容忍度,但结果是非常废话-16或-15.something,所以有什么问题?代码是否正确?请帮忙
答案 0 :(得分:3)
我不确定你想要实现什么,但可能使用:
if(fabs(p-p0)<tol){
而不是:
if((p-p0)<tol){
会让你更接近你想去的地方。
原因是所有负值都小于.001
,因此如果函数的结果为负值(如本例所示),则会立即停止。
顺便说一下:这张支票:
if(i>N){
永远不会成真。您可能打算使用==
或>=
代替>
。
答案 1 :(得分:3)
我认为您根本没有迭代算法适用的情况。 See here了解某些情况。你的函数在1.5附近没有一个有吸引力的固定点,算法也会发散。
但为什么数字:你的函数是f(x) = x^3 - 4x - 10
,所以解f(x) = x
相当于找到f(x) - x
的零,并且在5.35附近只有一个实零。但是,那时f'(x)
非常大,所以即使迭代算法也不可用。
数字根寻找算法可能是更合适的方法。
答案 2 :(得分:1)
fabs(p - p0) <= tol * fabs(p);
是否是正确值的正确公式。如果是特殊范围,您还必须关注NaN和Inf。
#include <limits>
#include <cfloat>
inline bool Equal(const double& x, const double& y)
{
const int classX (_fpclass(x));
if(classX != _fpclass(y)) {
return false;
}
switch(classX) {
case _FPCLASS_SNAN:
case _FPCLASS_QNAN:
case _FPCLASS_NINF:
case _FPCLASS_NZ :
case _FPCLASS_PZ :
case _FPCLASS_PINF:
return true;
break;
case _FPCLASS_NN :
case _FPCLASS_ND :
case _FPCLASS_PD :
case _FPCLASS_PN :
default:
break;
}
return fabs(x - y) <= std::numeric_limits<double>::epsilon() * fabs(x);
}