//多维无约束优化软件设计#include

#include

#include

double det=1e-5; //计算精度double det1=1e-3; //梯度判断精度double ak=3e-3; //搜索步长double dx=1e-4; //梯度计算步长

/*目标函数(n维)

入口参数:

x :n维数组,自变量

返回值 :函数值*/

double f(double *x)

{

double y;

y=(x[0]-2)*(x[0]-2)*(x[0]-2)*(x[0]-2)+(x[0]-2*x[1])*(x[0]-2*x[1]);

//y=(x[0]-2)^4+(x[0]-2*x[1])^2; return y;

}

/*计算X(k+1)=X(k)+a*S(k)

入口参数:

x_k : n维数组,自变量

s_k : n维数组,方向向量

a : 方向步长

n : 维数

出口参数:

x_k1 : 转换后的n维数组*/

void fun(double *x_k1,double *x_k,double *s_k,double a,int n)

{

int i;

for(i=0;i

x_k1[i]=x_k[i]+a*s_k[i];

}

/*进退法求谷区间

入口参数:

n :优化模型维数

x_k :n维数组,初始点坐标

s_k :n维数组,搜索方向向量

出口参数:

a1 :搜索区间步长下限

a3 :搜索区间步长上限*/

void Get_Search_area(int n,double *x_k,double *s_k,double *a1,double *a3)

{

double a=ak,s,f0,a2=0;

double f1=0,f2=0,f3=0;

double *x_k1;

x_k1=(double*)malloc(sizeof(double)*n);

f2=f(x_k);

while(1)

{

*a1=a2+a;

fun(x_k1,x_k,s_k,*a1,n);

f1=f(x_k1);

if(f1>f2)

{

if(a==ak)

{

*a3=*a1;

f3=f1;

a=-a;

continue;

}

else if(*a1>*a3)

{

s=*a1;

*a1=*a3;

*a3=s;

f0=f1;

f1=f3;

f3=f0;

break;

}

else break;

}

else

{

*a3=a2;

a2=*a1;

f3=f2;

f2=f1;

a=2*a;

continue;

}

}

free(x_k1);

}

/*黄金分割法求极小值*/

/*入口参数:

n :优化模型维数

a1 :搜索区间步长下限

a4 :索区间步长上限

s_k :n维数组,搜索方向向量*/

/*出口参数:

x_k :n维数组,极小点坐标*/

void Gold_division(int n,double a1,double a4,double *x_k,double *s_k)

{

double a2,a3,f2,f3,a_star;

double *x_k2,*x_k3; int i;

x_k2=(double*)malloc(sizeof(double)*n);

x_k3=(double*)malloc(sizeof(double)*n);

for(i=0;i

{

x_k2[i]=0;

x_k3[i]=0;

}

a2=a1+0.382*(a4-a1);

fun(x_k2,x_k,s_k,a2,n);

f2=f(x_k2);

a3=a1+0.618*(a4-a1);

fun(x_k3,x_k,s_k,a3,n);

f3=f(x_k3);

do

{

if(f2<=f3)

{

a4=a3;

a3=a2;

f3=f2;

a2=a1+0.382*(a4-a1);

fun(x_k2,x_k,s_k,a2,n);

f2=f(x_k2);

}

else

{

a1=a2;

a2=a3;

f2=f3;

a3=a1+0.618*(a4-a1);

fun(x_k3,x_k,s_k,a3,n);

f3=f(x_k3);

}

} while(fabs(a4-a1)>det);

a_star=(a1+a4)*0.5;

fun(x_k,x_k,s_k,a_star,n);

free(x_k2);

free(x_k3);

}

/*计算函数梯度

入口参数:

n :优化模型维数

dx :梯度步长

x_k :n维数组,初始点坐标

出口参数:

s_k :梯度的负方向向量*/

void tidu(int n,double dx,double x[],double s_k[])

{

int i;

double *x0;

x0=(double*)malloc(sizeof(double)*n);

for(i=0;i

x0[i]=x[i];

for(i=0;i

{

x0[i]=x[i]+dx;

s_k[i]=(f(x0)-f(x))/dx*(-1);

x0[i]=x0[i]-dx;

}

free(x0);

}

/*计算梯度范数

入口参数:

n :优化模型维数

s_k :梯度的负方向向量

返回值:梯度范数*/

double f_fanshu(int n,double s_k[])

{

int i;

double sum=0;

for(i=0;i

sum+=s_k[i]*s_k[i];

return (sqrt(sum));

}

/*梯度法求最优函数值

/*入口参数:

n :优化模型维数

x_k :n维数组,极小点坐标*/

/*出口参数:

f0 :函数极小值*/

void fun_tidu(int n,double *x_k,double *f0)

{

double *s_k;

double a1=0,a3=0;

double *a_1,*a_3;

a_1=&a1;

a_3=&a3;

s_k=(double*)malloc(sizeof(double)*n);

while(1)

{ tidu(n,dx,x_k,s_k);

if(f_fanshu(n,s_k)>det1)

{

Get_Search_area(n,x_k,s_k,a_1,a_3);

Gold_division(n,*a_1,*a_3,x_k,s_k);

}

else

break;

}

*f0=f(x_k);

free(s_k);

}

/*主函数*/

int main()

{

int n,i;

double *x_k,*f;

double f0=0;

f=&f0;

puts("原函数为f=(x[0]-2)*(x[0]-2)*(x[0]-2)*(x[0]-2)+(x[0]-2*x[1])*(x[0]-2*x[1]);\n");

puts("请输入变量维数n:\n");

scanf("%d",&n);

x_k=(double*)malloc(sizeof(double)*n);

printf("输入起始坐标x_k:\n");

for(i=0;i

{

scanf("%lf",&x_k[i]);

fun_tidu(n,x_k,f);

}

puts("函数极小点坐标:\n");

for(i=0;i

printf("%lf;",x_k[i]);

printf("\n");

puts("函数最优值:\n");

printf("%lf\n",*f);

free(x_k);

return 0;

}

c语言编程用进退法求搜索区间代码,用c对函数进行优化的问题相关推荐

  1. Matlab代码,一维搜索用进退法确定搜索区间

    在使用二维优化算法时,经常需要调用一维搜索算法求步长,而一维搜索算法需要确定搜索区间.进退法不仅可以直接当作一维搜素算法使用,也可以用来确定一维搜索区间. 进退法确定搜索区间的原理是: 假设一维目标函 ...

  2. C语言编程用递归法求

    7,用递归法求: (x2!)+(xxx3!)+(5个x相乘5!)+-+((2n-2)个x相乘(2n-2)!)当N为某值是上式为几?(到第n项,n和x的值有键盘输入.) #include<stdi ...

  3. C语言编程用递归法求5!

    问题描述:请利用递归方法求5!. 问题分析:递归公式:km=km_1*4! 程序源码: #include<stdio.h> int main() { int i; int fact(); ...

  4. 【离散数学】Java语言实现利用真值表法求主析取范式和主合取范式

    C++版本的看这个链接: [离散数学]C++语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/ ...

  5. 【离散数学】C++语言实现利用真值表法求主析取范式和主合取范式

    Java版本的如下链接所示: Java语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/art ...

  6. c语言坐标海伦公式,C语言:用海伦公式求三角形面积 , C语言编程问题,利用海伦公式求三角形面积...

    导航:网站首页 > C语言:用海伦公式求三角形面积 , C语言编程问题,利用海伦公式求三角形面积 C语言:用海伦公式求三角形面积 , C语言编程问题,利用海伦公式求三角形面积 匿名网友: 程序已 ...

  7. matlab 计算变异系数,变异系数法求权重matlab 代码

    利用matlab编程,很容易根据变异系数法,求得多指标综合评价模型的权重. 代码如果有不懂的地方,可以联系我. 变异系数法求权重matlab 代码 clear;clc; [data1,header1] ...

  8. matlab 计算变异系数,变异系数法求权重matlab代码

    <变异系数法求权重matlab代码>由会员分享,可在线阅读,更多相关<变异系数法求权重matlab代码(1页珍藏版)>请在读根文库上搜索. 1.变异系数 法求权重 matlab ...

  9. C语言编程>第二十二周 ① 下列给定程序中,函数fun的功能是:找出一个大于给定整数n且紧随n的素数,并作为函数值返回。

    例题:下列给定程序中,函数fun的功能是:找出一个大于给定整数n且紧随n的素数,并作为函数值返回. 例如,输入 整数为32,则输出的数素数为37". 注意:不要改动main函数,不能增行或删 ...

最新文章

  1. 从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 转载 2017年08月01日 17:09:03 标签: 机器学习 / 数据 719 转自:http://www.sohu.com/a/12
  2. 国内数据中心制冷系统设计与发展
  3. 大数据盘点00后求职选择,过半职场新人会因工作太简单辞职?
  4. hdu1156(简单线段树 模板题)
  5. 【转载】我心目中最好的框架组合是
  6. 黑马程序员-JavaSE核心知识-03第一个Java程序
  7. oracle 10g 返回RemoteOperationException: ERROR: Wrong password for user
  8. 计算机丢失wpcap.dll会影响什么,Win7系统提示wpcap.dll丢失如何解决?
  9. 讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术
  10. coolfire文章之五
  11. 疫情之下,分享几款免费CRM系统,提高在家办公效率!
  12. 工程电磁场matlab仿真,带电粒子在电磁场中运动的MATLAB仿真.doc
  13. 大气压力换算公式_大气压强计算新方法
  14. stm32中用到的实时系统_南京理工大学谢云云、谷志强等:光储系统如何在实时市场中获得更高的收益?...
  15. 怎么把foxmail的邮件和服务器同步,foxmail设置ActiveSync同步功能怎么操作?设置ActiveSync同步功能方法介绍...
  16. 【转】如何使用visual studio将你的程序打包成安装包
  17. 水瓶座的女人,生活中不只需要代码(转帖)
  18. GStreamer开发介绍
  19. js生成二维码以及插入图片
  20. 那些你投的基金没告诉你的事

热门文章

  1. hibernate数据类型与OR映射
  2. javscript 实现iframe加载内容页出现LOADING效果
  3. java发送邮件所需jar包_javamail 发邮件所需jar 包两个 activation.jar,mail.jar | 学步园...
  4. github怎么自动更新被人更新过的项目_8 个程序员应该掌握的 GitHub 实用技巧
  5. C语言结构和高二的知识,c语言基础知识复习.pdf
  6. Doom HDU - 5239(线段树+思维)
  7. StratifiedKFold和KFold(5折验证)交叉验证的联系和区别Python实例
  8. php伪静态后无法获得url中参数_php runtime、http web中rewrite浅解和方案
  9. php中的getdate+函数,PHP中的getdate()函数
  10. 深度学习之循环神经网络(1)序列表示方法