24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1881  |  回复: 8

renchong

银虫 (小有名气)

[求助] 一个区间搜索的c语言程序 出问题了

我写了个搜索 大-小-大 区间的程序 ,但最后运行结果始终是错的,不清楚哪里有问题(演算过 逻辑上是正确的)求虫友们帮帮忙
#include
main()
{
int a,b,x0,x1,x2,h,f0,f1,f2;
printf("please input the number\n";
scanf("x0=%d,h=%d",&x0,&h);
x1=x0+h;
f1=f(x1);
f0=f(x0);
if(f1     {
    h=2*h;
    x2=x0+h;
    f2=f(x2);
    for(f1,f2;f2         {
            x0=x1;
            x1=x2;
            x2=x1+h;
            f0=f(x0);
            f1=f(x1);
            f2=f(x2);
        }
    a=x0;
    b=x2;
    }
else
    {
    h=-h;
    x2=x0+h;
    f2=f(x2);
    for(f0,f2;f2         {
            x1=x0;
            x0=x2;
            x2=x0+h;
            f0=f(x0);
            f1=f(x1);
            f2=f(x2);
        }
    a=x2;
    b=x1;
    }
printf("a=%d,b=%d\n",a,b);
getch();
}
int f(int n)
{
return 2+n^2;
}
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

微尘、梦想

木虫 (知名作家)

【答案】应助回帖

感谢参与,应助指数 +1
什么是大小大区间的程序呀,没明白是什么意思,能解释点清楚么,你的代码实在太难看了~
任风云变幻,我笑对人生!
2楼2011-12-15 20:22:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangyuewu08

木虫 (著名写手)

【答案】应助回帖


感谢参与,应助指数 +1
jjdg(金币+1): 感谢支持 2011-12-16 01:14:03
我曾经编过类似的程序,大 - 小 - 大区间是用来确定凹函数的极值区间的,这段程序是用来求解凹函数的极值区间并求极值的吧,我直接站过来吧
CODE:
/****************************************************************
*        名称 :        确定搜索区间的外推法                                      *
*        说明 :        假设函数f( x )具有单谷性,即在所考虑的区间内部,          *
*                          函数f( x )有唯一的极小点x0。为了确定极小点x所在           *
*                          的区间,应使函数f( x )在[ a, b ]区间内形成                *
*                          “高-低-高”趋势。                                        *
*        作者 :        ***                                                                                                *
*        日期 :        2011-05-22                                                                                         *
****************************************************************/
#include

/****************************************************
*        函数声明                                                            *
****************************************************/
double f( double );
/****************************************************
*        主函数                                                                    *
****************************************************/
int main( void )
{
        double x_1, x_2, x_3;                        //定义横坐标
        double y_1, y_2, y_3;                        //定义相应的纵坐标,以减少调用函数的次数,以前没有想到这一点,程序中的重复计算越少越好
        int step;                                                //搜索步长
        double tmp;                                                //中间变量
       
        //初始化搜索
        step = 1;                                                //step的初值对搜索次数影响不大,因为调整时是按照幂次                                       
        x_1 = 0;                                                //x_1对搜索次数的影响很大
        y_1 = f( x_1 );
        x_2 = x_1 + step;
        y_2 = f( x_2 );
       
        //开始搜索
        if( y_2 > y_1 )                                        //调整搜索方向
        {
                step = -step;                                //C语言中有负号运算符
                tmp = x_1;                                        //对x_1和x_2进行交换
                x_1 = x_2;
                x_2 = tmp;
                tmp = y_1;                                        //对y_1和y_2进行交换
                y_1 = y_2;
                y_2 = tmp;
        }
        else                                                        //空语句可以增加程序的易读性
        {
                ;
        }

往事并不如烟
3楼2011-12-15 21:53:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangyuewu08

木虫 (著名写手)

【答案】应助回帖


jjdg(金币+1): 辛苦了 2011-12-16 01:14:13
刚刚没有全选
CODE:
/****************************************************************
*        名称 :        确定搜索区间的外推法                                      *
*        说明 :        假设函数f( x )具有单谷性,即在所考虑的区间内部,          *
*                          函数f( x )有唯一的极小点x0。为了确定极小点x所在           *
*                          的区间,应使函数f( x )在[ a, b ]区间内形成                *
*                          “高-低-高”趋势。                                        *
*        作者 :        ***                                                                                                *
*        日期 :        2011-05-22                                                                                         *
****************************************************************/
#include

/****************************************************
*        函数声明                                                            *
****************************************************/
double f( double );
/****************************************************
*        主函数                                                                    *
****************************************************/
int main( void )
{
        double x_1, x_2, x_3;                        //定义横坐标
        double y_1, y_2, y_3;                        //定义相应的纵坐标,以减少调用函数的次数,以前没有想到这一点,程序中的重复计算越少越好
        int step;                                                //搜索步长
        double tmp;                                                //中间变量
       
        //初始化搜索
        step = 1;                                                //step的初值对搜索次数影响不大,因为调整时是按照幂次                                       
        x_1 = 0;                                                //x_1对搜索次数的影响很大
        y_1 = f( x_1 );
        x_2 = x_1 + step;
        y_2 = f( x_2 );
       
        //开始搜索
        if( y_2 > y_1 )                                        //调整搜索方向
        {
                step = -step;                                //C语言中有负号运算符
                tmp = x_1;                                        //对x_1和x_2进行交换
                x_1 = x_2;
                x_2 = tmp;
                tmp = y_1;                                        //对y_1和y_2进行交换
                y_1 = y_2;
                y_2 = tmp;
        }
        else                                                        //空语句可以增加程序的易读性
        {
                ;
        }
       
        x_3 = x_2 + step;                                //为了减少代码的长度,应该修改成do...while的形式
        y_3 = f( x_3 );                                        //但修改之后,逻辑性不强
        while( y_3 < y_2 )
        {
                x_1 = x_2;
                x_2 = x_3;
                x_3 = x_2 + step;
                y_1 = y_2;
                y_2 = y_3;
                y_3 = f( x_3 );
                step = 2 * step;
        }
       
        if( x_1 > x_3 )                                        //将区间按照从小到大的顺序调整,只需调整两端点
        {                                                                //这样调整是为了符合“左小右大”的习惯
                tmp = x_1;
                x_1 = x_3;
                x_3 = tmp;
                tmp = y_1;
                y_1 = y_3;
                y_3 = tmp;
        }
       
        printf( "x_1 = %f, x_2 = %f, x_3 = %f\n", x_1, x_2, x_3 );
        printf( "y_1 = %f, y_2 = %f, y_3 = %f\n", y_1, y_2, y_3 );
       
        return( 0 );                                        //返回0,表示程序结束
}
/********************************************************
*        函数名称 :        目标函数                                                                *
*   输入变量 :        横坐标x                                                                        *
*        输出变量 :        纵坐标y                                                             *
*        说    明 :        目标函数要求具有单谷性                                        *
********************************************************/
double f( double x )
{
        double y;
       
        y = x * x - 2 *x + 1;
       
        return( y );
}

往事并不如烟
4楼2011-12-15 21:54:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangyuewu08

木虫 (著名写手)

【答案】应助回帖


jjdg(金币+1): 辛苦了 2011-12-16 01:14:23
renchong(金币+5): 非常感谢 2011-12-16 12:41:10
CODE:
#include
main()
{
int a,b,x0,x1,x2,h,f0,f1,f2;
printf("please input the number\n";
scanf("x0=%d,h=%d",&x0,&h);
x1=x0+h;
f1=f(x1);
f0=f(x0);
if(f1      {
     h=2*h;
     x2=x0+h; /*这句逻辑上有问题,应该是x2 = x1 + h,否则x2等于x1,下面的循环从一开始就不会执行*/
     f2=f(x2);
     for(f1,f2;f2

往事并不如烟
5楼2011-12-15 22:14:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangyuewu08

木虫 (著名写手)

看到自己以前写的程序,风格实在是太烂了,最近在重新学习C语言,找到了一种更好的风格,刚刚重写了一次,比之前的紧凑很多,分享一下。
CODE:
/*
        修改:使用新的代码风格,2011-12-16                                                                                */

#include

double f(double);

int main(void)
{
        int                step;                                /*        变量按照词典的顺序安排                                        */
        double        temp;
        double        x_1, x_2, x_3;                /*        定义横坐标                                                                */
        double        y_1, y_2, y_3;                /*        定义相应的纵坐标,以减少调用函数的次数        */
       
        step = 1;                                        /*        初始化搜索                                                                */
        x_1 = 0;                                        /*        step按幂次变化,初值对搜索次数影响不大        */
        y_1 = f(x_1);
        x_2 = x_1 + step;
        y_2 = f(x_2);
        if (y_2 > y_1) {                        /*        改变搜索方向                                                        */
                step = -step;
                temp = x_1, x_1 = x_2, x_2 = temp;
                temp = y_1, y_1 = y_2, y_2 = temp;
        }
        x_3 = x_2 + step;
        y_3 = f(x_3);
        while (y_3 < y_2) {
                step *= 2;
                x_1 = x_2, x_2 = x_3, x_3 = x_2 + step;
                y_1 = y_2, y_2 = y_3, y_3 = f(x_3);
        }
        if (x_1 > x_3) {
                temp = x_1, x_1 = x_3, x_3 = temp;
                temp = y_1, y_1 = y_3, y_3 = temp;
        }
        printf("x_1 = %f, x_2 = %f, x_3 = %f\n", x_1, x_2, x_3);
        printf("y_1 = %f, y_2 = %f, y_3 = %f\n", y_1, y_2, y_3);
       
       
        return 0;
}

/*
        函数名称:目标函数f
        输入变量:横坐标x
        输出变量:纵坐标y
        说    明 :目标函数要求具有单谷性
                                                                                                                                                        */
double f(double x)
{
        double y;
       
        y = x*x - 2*x + 1;
        return y;
}

往事并不如烟
6楼2011-12-16 15:09:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xqhuang8793

金虫 (初入文坛)

楼主,你的程序有几个小问题,给你稍微改了下,仅供参考,测试几个例子,已通过。
#include

int f(int n)
{
        return 2 + n * n;
}

int main()
{
        int a, b, x0, x1, x2, h, f0, f1, f2;
        printf("please input the number: x0 = ";
        scanf("%d", &x0);
        printf("please input the number: h = ";
        scanf("%d", &h);
        x1 = x0 + h;
        f1 = f(x1);
        f0 = f(x0);
        if(f1 < f0){
                x2 = x1+h;
                f2 = f(x2);
                while(f2 < f1){
                        x0 = x1;
                        x1 = x2;
                        x2 = x1+h;
                        f0 = f(x0);
                        f1 = f(x1);
                        f2 = f(x2);
                }
                a = x1;
                b = x2;
        }
        else{
                x2 = x0 - h;
                f2 = f(x2);
                while(f2 < f0){
                        x1 = x0;
                        x0 = x2;
                        x2 = x0-h;
                        f0=f(x0);
                        f1=f(x1);
                        f2=f(x2);
                }
                a=x2;
                b=x1;
        }
        printf("a = %d, b = %d\n", a, b);
        return 0;
}

» 本帖已获得的红花(最新10朵)

7楼2011-12-16 15:15:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

renchong

银虫 (小有名气)

送鲜花一朵
引用回帖:
: Originally posted by xqhuang8793 at 2011-12-16 15:15:06:
楼主,你的程序有几个小问题,给你稍微改了下,仅供参考,测试几个例子,已通过。
#include<stdio.h>

int f(int n)
{
        return 2 + n * n;
}

int main()
{
        int a, b, x0, x1, x2, h, f0, f1, f ...

非常感谢  本来想送BB的 但是没找到送的地方 一朵花 聊表感谢哈
8楼2011-12-16 16:27:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xqhuang8793

金虫 (初入文坛)

引用回帖:
8楼: Originally posted by renchong at 2011-12-16 16:27:33:
非常感谢  本来想送BB的 但是没找到送的地方 一朵花 聊表感谢哈

没事,互帮互助嘛
9楼2011-12-16 17:43:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 renchong 的主题更新
信息提示
请填处理意见