求教编程高手看看我的弦截法程序

来源:百度知道 编辑:UC知道 时间:2024/06/08 08:05:27
下面是用弦截法搜索复杂方程的解的程序。
运行下面的程序求y = (float)(((X - 5.0)*X + 16.0)*X - 80.0);结果是没有问题的,输入搜索区间(2,6),输出结果为5;但把程序中所有的“float”换为“double”后就出问题了,不出结果了。请教高手是怎么回事。
最严重的是,求y = (float)(1/(1 + pow(1 - (X - Xi)/(1 - Xi), 11.4 - 8.8*X)*VisR/(0.5*pow((X - Xi)/(1 - Xi), 1.7))));(注释掉y = (float)(((X - 5.0)*X + 16.0)*X - 80.0);)时,无论输入的搜索范围多少输出结果都是-1.#IND(正确结果为0.4几),求高手帮帮小弟,不胜感激!!

/////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <math.h>
#define Xi 0.3
#define Fw 0.1
#define VisR 0.393
#define e 0.000001

/////////////////////////////////////////////////////////////////////////////

float f(float X)
{
float y;
// y = (float)(1/(1 + pow(1 - (X - Xi)/(1 - Xi), 11.4 - 8.8*X)*VisR/(0.5*pow((X - Xi)/(1 - Xi), 1.7))));
y = (float)(((X - 5.0)*X + 16.0)*X - 80.0);
return(y);
}

///////////////////////

你的第一个问题出在scanf函数上.
如果输入的是double型,scanf的参数应该用%lf而不是%f

当你求y = (float)(1/(1 + pow(1 - (X - Xi)/(1 - Xi), 11.4 - 8.8*X)*VisR/(0.5*pow((X - Xi)/(1 - Xi), 1.7))));方程解时乎略掉了负数求解开方的可能性.当pow地一个参数为负数时返回的就是1.#IND.

我改了你程序的几个地方,现在是能用了,但是结果不是你期望的0.4几,看看对你有没有帮助吧.
/////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <math.h>
#define Xi 0.3
#define Fw 0.1
#define VisR 0.393
#define e 0.000001

/////////////////////////////////////////////////////////////////////////////

double f(double X)
{
double y,y1,y2;
y1=1 - (X - Xi)/(1 - Xi);
if(y1>0)
y1=pow(y1,11.4 - 8.8*X);
else
y1=-pow(-y1,11.4 - 8.8*X);

y2=(X - Xi)/(1 - Xi);
if(y2>0)
y2=pow(y2,1.7);
else
y2=-pow(-y2,1.7);
y = (float)(1/(1 +y1 *VisR/(0.5*y2)));
//y = (double)(((X - 5.0)*X + 16.0)*X - 80.0);
ret