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;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python关闭指定浏览器页面_Python自动关闭浏览器关闭网页的方法

在py编辑窗口中输入代码&#xff1a; from selenium.webdriver.chrome.options import Options from selenium import webdriver __browser_url rC:\Users\Administrator\AppData\Roaming\360se6\Application\360se.exe chrome_options Options() chrome_options.binary_loca…

ubuntu 安装kde桌面_在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法

本文介绍在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法。Plasma Desktop是KDE创建的一种流行且功能强大的桌面环境&#xff0c;主要用于Linux系统。KDE Plasma的当前版本是5&#xff0c;它是KDE Plasma 4的后续版本&#xff0c;旨在帮助您以高效的方式完成工作。当Plasma强…

c语言将字母的acsaii,C语言上机实验 答案

《C语言上机实验 答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言上机实验 答案(31页珍藏版)》请在装配图网上搜索。1、实验一 上机操作初步(2学时)一、实验方式&#xff1a;一人一机二、实验目的&#xff1a;1、熟悉VC语言的上机环境及上机操作过程。2、了…

python怎么调用列表_Python中列表的使用

python中的列表与java中的数组非常类似&#xff0c;但使用方法比java中数组简单很多&#xff0c;python中的数据类型不需要显示声明&#xff0c;但在使用时必须赋值&#xff0c;列表元素下标从0开始 初始化列表&#xff08;初始化一个包含五个元素的列表和一个空列表&#xff0…

videowriter最小的编码格式_cv2.VideoWriter() 指定写入视频帧编码格式

今天用opencv保存的视频文件超级大&#xff0c;被小伙伴们嘲笑&#xff0c;哈哈&#xff0c;原来是视频帧编码格式导致的&#xff0c;这里记录下常用的保存视频编码格式。编码参数&#xff1a;cv2.VideoWriter_fourcc(‘I‘,‘4‘,‘2‘,‘0‘)---未压缩的YUV颜色编码&#xff…

C语言和JAVA可以互相转换吗,求助大神!!!JAVA转换成C语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//此处不要看&#xff0c;c应该内置了这个函数&#xff0c;不需要自定义Array.prototype.remove function(val) {var index this.indexOf(val);if (index > -1) {this.splice(index,1);}};//名称:获取当天上班的人//参数&…

windows消息队列C语言,08年计算机二级C语言辅导:vc操作微软消息队列的方法

定义IMSMQQueuePtr qDest; // Represents Destination QueueIMSMQQueueInfoPtr qInfo; //Represents an open instance of the destination queueIMSMQQueueInfoPtr qRead;IMSMQMessagePtr qMsg; //Represents the message初始化qDest NULL;CoInitialize(NULL);try{qInfo.Crea…

jwt重放攻击_【干货分享】基于JWT的Token认证机制及安全问题

一步一步教你基于JWT的Token认证机制实现&#xff0c;以及如何防范XSS攻击、Replay攻击和中间人攻击。文章目录一、几种常用的认证机制1.1 HTTP Basic AuthHTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password&#xff0c;简言之&#xff0c;Basic Auth…

jquery find 找到frame select_简述jQuery

jQuery 是一个高效、精简并且功能丰富的 JavaScript 工具库。它提供的 API 易于使用且兼容众多浏览器&#xff0c;这让诸如 HTML 文档遍历和操作、事件处理、动画和 Ajax 操作更加简单。一、获取元素jQuery的核心设计思想就是获取元素&#xff0c;然后对其操作&#xff1b;因此…

求中位数中回文数之和C语言,一些算法题及答案

1. 两数之和给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。示例:给定 nums [2, 7, 11, 1…

自然哲学的数学原理_物理起源点,牛顿《自然哲学的数学原理》

1687年 英国艾萨克牛顿(Sir Isaac Newton&#xff0c;1643—1727)&#xff0c;英国物理学家、数学家、天文学家、自然哲学家和炼金术士。1687年他发表《自然哲学的数 学原理》&#xff0c;阐述了万有引力和三大运动定律&#xff0c;奠定了此后三个世纪里力学和天文学的基础&…

如何将另外一个表里的数据与联动_跨境电商(亚马逊)后台财务数据包

亚马逊后台的财务数据包是刚进这个行业的财务人员最希望能了解熟悉的&#xff0c;这块也是相对于国内财务比较有难度的内容&#xff0c;主要难点是亚马逊平台是新的东西&#xff0c;国内财务对规则&#xff0c;费用内容&#xff0c;流程都比较懵&#xff0c;另外就是各项资料都…

java和python混合编程_浅谈C++与Java混合编程

在学习编程的过程中&#xff0c;我觉得不止要获得课本的知识&#xff0c;更多的是通过学习技术知识提高解决问题的能力&#xff0c;这样我们才能走在最前方&#xff0c;更多Java学习&#xff0c;请登陆疯狂java官网。现实的情况是&#xff0c;真实的项目中&#xff0c;通常是涉…

无法在源表中获得一组稳定的行_行输出变压器的结构、符号及电路分析

行输出变压器又称逆程变压器、回扫变压器&#xff0c;俗称行输出&#xff0c;它是电视机、显示器中的一个重要变压器。1.行输出变压器结构行输出变压器的全部绕组和高压整流管均密封在其中&#xff0c;底部引出各个绕组的引脚&#xff0c;高压输出采用高压引线直接送至显像管的…

c语言中bluetooth函数,C语言中的低功耗蓝牙-使用Bluez创建GATT服务器

小编典典我得到了运行BlueZ 5.31的示例GATT服务器(截至本文的最新信息)&#xff1a;我的环境&#xff1a; 作为来宾OS(版本14.04 32位操作系统)的VagrantVirtual BoxUbuntu Trusty Tahr更新到linux内核3.19已安装的软件包&#xff1a;libglib2.0-dev libdbus-1-devlibudev-dev …

c++ map是有序还是无序的_c++ unorder_map的用法

1、unorder_map与map不同&#xff1a;map的KEY值是有序的&#xff0c;而unorder_map则是无序的&#xff1b;2、unorder_map自定义的KEY值时需要注意思下面两点&#xff1a; KEY为一个类时&#xff0c;需要重载符号&#xff1b; 需要自定义一个HASH类&#xff0c;至于为什么&…

pid调节软件_非常实用的PID算法和PID控制原理

点击箭头处“工业之家”&#xff0c;选择“关注公众号”&#xff01;PID控制原理和特点工程实际中&#xff0c;应用最为广泛调节器控制规律为比例、积分、微分控制&#xff0c;简称PID控制&#xff0c;又称PID调节。PID控制器问世至今已有近70年历史&#xff0c;它以其结构简单…

c语言的有趣小程序,一个有趣的小程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼源码:#include #include #include #include #include HINSTANCE g_hInstance 0;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nSh…

对pca降维后的手写体数字图片数据分类_【AI白身境】深度学习中的数据可视化...

今天是新专栏《AI白身境》的第八篇&#xff0c;所谓白身&#xff0c;就是什么都不会&#xff0c;还没有进入角色。上一节我们已经讲述了如何用爬虫爬取数据&#xff0c;那爬取完数据之后就应该是进行处理了&#xff0c;一个很常用的手段是数据可视化。通过数据可视化&#xff0…

android实现箭头流程列表_反思|Android 列表分页组件Paging的设计与实现:系统概述...

作者&#xff1a;却把清梅嗅链接&#xff1a;https://github.com/qingmei2/blogs/issues/30前言本文将对Paging分页组件的设计和实现进行一个系统整体的概述&#xff0c;强烈建议 读者将本文作为学习Paging 阅读优先级最高的文章&#xff0c;所有其它的Paging中文博客阅读优先级…