| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 443 人关注过本帖, 1 人收藏
标题:关于输出结果问题
取消只看楼主 加入收藏
eastern210
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-7-5
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:1 
关于输出结果问题
弱弱的问一个问题,我用printf和cout编同一个问题时,为什么输出结果不一样?printf输出的是六位的小数,而cout是用科学计数法出来的小数?
源程序如下:

这个是用cout输出的:
#include <iostream>
#include <iostream.h>
#include <stdio.h>
#include <math.h>
double x1=2,x2=2;                    
double E=pow(10,-6);                          /*给定起始点的值为x1,x2,并定义精度为E*/


double fun1(double x1,double x2)            /*定义函数fun1为目标函数*/
{double y;
 y=pow(x1,2)+25*pow(x2,2);
 return y;
}


double fun2(double g[],double x1,double x2)            /*定义函数fun2为求步长的函数*/
{
 double buchang;
 buchang=-(g[0]*x1+25*g[1]*x2)/(pow(g[0],2)+25*pow(g[1],2));
 return buchang;
}


void gtd1()
{ double t, beta,  d[2],g[4], y, m;
                                
  int k=1;
  g[0]=2*x1;                                /*目标函数对x1求偏导*/
  g[1]=50*x2;                               /*目标函数对x2求偏导,求梯度*/
  m=(sqrt(g[0]*g[0]+g[1]*g[1]));       /*对g[0]*g[0]+g[1]*g[1]求开方,将值赋给m*/
  while(m>E&&k<=10)                            /*判断,当m>E时进行以下循环*/
  {
      if (k==1)
  {
    d[0]=-g[0];
    d[1]=-g[1];
    beta=0;
  }                      /*计算因子beta*/
else
{
    beta=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]);    /*计算因子beta*/
    d[0]=-g[0]+beta*d[0];
    d[1]=-g[1]+beta*d[1];
  }
    t=fun2(d,x1,x2);                        /*计算步长*/
    x1=x1+d[0]*t;                        /*根据步长和搜索方向求出新的x1,x2*/
    x2=x2+d[1]*t;
    cout<<"----------------------------------------------------"<<"\n";
    cout<<"迭代次数为:"<<k<<"\n";
    cout<<"梯度为:"<<g[0]<<'\t'<<g[1]<<"梯度的模"<<m<<"\n";
    cout<<"搜索方向为:"<<d[0]<<'\t'<<d[1];
    cout<<"\n"<<"计算因子"<<beta<<"步长"<<t<<"\n";
    cout<<"x的值"<<x1<<'\t'<<x2;  
    g[2]=g[0];
    g[3]=g[1];
    g[0]=2*x1;             /*根据得到的x1,x2求出新的梯度,并将值*/
    g[1]=50*x2;                     /*赋给g[0],g[1],*/
    m=double(sqrt(g[0]*g[0]+g[1]*g[1]));                /*计算新的m*/         
    cout<<"\n"<<"新的负梯度的模"<<m<<"\n";

    k++;
  }
  
  y=fun1(x1,x2);                      /*当m不满足m>E的时候退出循环,并计算fun1,*/
  cout<<"最优解为x1,x2"<<x1<<'\t'<<x2<<"\n";             /*将值赋给y,并输出。*/
  cout<<"极小值为y="<<y<<endl;

}  
void main()
{
gtd1();
system("pause");
}
这个是用printf输出的:
#include <iostream>
#include "stdio.h"
#include "math.h"
double x1=2,x2=2;                    
double E=pow(10,-6);                          /*给定起始点的值为x1,x2,并定义精度为E*/


double fun1(double x1,double x2)            /*定义函数fun1为目标函数*/
{double y;
 y=x1*x1+25*x2*x2;
 return y;
}


double fun2(double g[],double x1,double x2)            /*定义函数fun2为求步长的函数*/
{
 double buchang;
 buchang=-(g[0]*x1+25*g[1]*x2)/(g[0]*g[0]+25*g[1]*g[1]);
 return buchang;
}


void main()
{ double t, beta,  d[2],g[4], y, m;
                                
  int k=1;
  g[0]=2*x1;                                /*目标函数对x1求偏导*/
  g[1]=50*x2;                               /*目标函数对x2求偏导,求梯度*/
  m=(sqrt(g[0]*g[0]+g[1]*g[1]));       /*对g[0]*g[0]+g[1]*g[1]求开方,将值赋给m*/
  while(m>E&&k<=10)                            /*判断,当m>E时进行以下循环*/
  {
      if (k==1)
  {
    d[0]=-g[0];
    d[1]=-g[1];
    beta=0;
  }                      /*计算因子beta*/
else
{
    beta=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]);    /*计算因子beta*/
    d[0]=-g[0]+beta*d[0];
    d[1]=-g[1]+beta*d[1];
  }
    t=fun2(d,x1,x2);                        /*计算步长*/
    x1=x1+d[0]*t;                        /*根据步长和搜索方向求出新的x1,x2*/
    x2=x2+d[1]*t;
    printf("迭代次数为%d\n",k);
    printf("梯度%f,%f,梯度的模%f\n",g[0],g[1],m);
    printf("搜索方向%f,%f,计算因子 %f,步长%f\n",d[0],d[1],beta,t);
    printf("x的值%f,%f\n",x1,x2);  
    g[2]=g[0];
    g[3]=g[1];
    g[0]=2*x1;             /*根据得到的x1,x2求出新的梯度,并将值*/
    g[1]=50*x2;                     /*赋给g[0],g[1],*/
    m=double(sqrt(g[0]*g[0]+g[1]*g[1]));                /*计算新的m*/         
    printf("新的负梯度的模%f\n",m);

    k++;
  }
  
  y=fun1(x1,x2);                      /*当m不满足m>E的时候退出循环,并计算fun1,*/
  printf("分别输出x1,x2 %f,%f\n",x1,x2);             /*将值赋给y,并输出。*/
  printf("极小值y %f",y);
  system("pause");
}  
求解释,多谢!
搜索更多相关主题的帖子: include double return 源程序 
2013-07-05 10:00
eastern210
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-7-5
收藏
得分:0 
回复 2楼 rjsp
谢谢版主!我是纯新手一枚,以后希望多多指教。
2013-07-06 10:11
快速回复:关于输出结果问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018005 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved