c语言编程用进退法求搜索区间代码,用c对函数进行优化的问题
//多维无约束优化软件设计#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对函数进行优化的问题相关推荐
- Matlab代码,一维搜索用进退法确定搜索区间
在使用二维优化算法时,经常需要调用一维搜索算法求步长,而一维搜索算法需要确定搜索区间.进退法不仅可以直接当作一维搜素算法使用,也可以用来确定一维搜索区间. 进退法确定搜索区间的原理是: 假设一维目标函 ...
- C语言编程用递归法求
7,用递归法求: (x2!)+(xxx3!)+(5个x相乘5!)+-+((2n-2)个x相乘(2n-2)!)当N为某值是上式为几?(到第n项,n和x的值有键盘输入.) #include<stdi ...
- C语言编程用递归法求5!
问题描述:请利用递归方法求5!. 问题分析:递归公式:km=km_1*4! 程序源码: #include<stdio.h> int main() { int i; int fact(); ...
- 【离散数学】Java语言实现利用真值表法求主析取范式和主合取范式
C++版本的看这个链接: [离散数学]C++语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/ ...
- 【离散数学】C++语言实现利用真值表法求主析取范式和主合取范式
Java版本的如下链接所示: Java语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/art ...
- c语言坐标海伦公式,C语言:用海伦公式求三角形面积 , C语言编程问题,利用海伦公式求三角形面积...
导航:网站首页 > C语言:用海伦公式求三角形面积 , C语言编程问题,利用海伦公式求三角形面积 C语言:用海伦公式求三角形面积 , C语言编程问题,利用海伦公式求三角形面积 匿名网友: 程序已 ...
- matlab 计算变异系数,变异系数法求权重matlab 代码
利用matlab编程,很容易根据变异系数法,求得多指标综合评价模型的权重. 代码如果有不懂的地方,可以联系我. 变异系数法求权重matlab 代码 clear;clc; [data1,header1] ...
- matlab 计算变异系数,变异系数法求权重matlab代码
<变异系数法求权重matlab代码>由会员分享,可在线阅读,更多相关<变异系数法求权重matlab代码(1页珍藏版)>请在读根文库上搜索. 1.变异系数 法求权重 matlab ...
- C语言编程>第二十二周 ① 下列给定程序中,函数fun的功能是:找出一个大于给定整数n且紧随n的素数,并作为函数值返回。
例题:下列给定程序中,函数fun的功能是:找出一个大于给定整数n且紧随n的素数,并作为函数值返回. 例如,输入 整数为32,则输出的数素数为37". 注意:不要改动main函数,不能增行或删 ...
最新文章
- 从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 转载 2017年08月01日 17:09:03 标签: 机器学习 / 数据 719 转自:http://www.sohu.com/a/12
- 国内数据中心制冷系统设计与发展
- 大数据盘点00后求职选择,过半职场新人会因工作太简单辞职?
- hdu1156(简单线段树 模板题)
- 【转载】我心目中最好的框架组合是
- 黑马程序员-JavaSE核心知识-03第一个Java程序
- oracle 10g 返回RemoteOperationException: ERROR: Wrong password for user
- 计算机丢失wpcap.dll会影响什么,Win7系统提示wpcap.dll丢失如何解决?
- 讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术
- coolfire文章之五
- 疫情之下,分享几款免费CRM系统,提高在家办公效率!
- 工程电磁场matlab仿真,带电粒子在电磁场中运动的MATLAB仿真.doc
- 大气压力换算公式_大气压强计算新方法
- stm32中用到的实时系统_南京理工大学谢云云、谷志强等:光储系统如何在实时市场中获得更高的收益?...
- 怎么把foxmail的邮件和服务器同步,foxmail设置ActiveSync同步功能怎么操作?设置ActiveSync同步功能方法介绍...
- 【转】如何使用visual studio将你的程序打包成安装包
- 水瓶座的女人,生活中不只需要代码(转帖)
- GStreamer开发介绍
- js生成二维码以及插入图片
- 那些你投的基金没告诉你的事
热门文章
- hibernate数据类型与OR映射
- javscript 实现iframe加载内容页出现LOADING效果
- java发送邮件所需jar包_javamail 发邮件所需jar 包两个 activation.jar,mail.jar | 学步园...
- github怎么自动更新被人更新过的项目_8 个程序员应该掌握的 GitHub 实用技巧
- C语言结构和高二的知识,c语言基础知识复习.pdf
- Doom HDU - 5239(线段树+思维)
- StratifiedKFold和KFold(5折验证)交叉验证的联系和区别Python实例
- php伪静态后无法获得url中参数_php runtime、http web中rewrite浅解和方案
- php中的getdate+函数,PHP中的getdate()函数
- 深度学习之循环神经网络(1)序列表示方法