最优化方法大作业-算法源程序-0.618法、抛物线法、共轭梯度法

合集下载

最优化方法

最优化方法

随机梯度下降每次迭代只使用一个样本,迭代 一次计算量为n 2 ,当样本个数m很大的时候, 随机梯度下降迭代一次的速度要远高于批量梯 度下降方法。 两者的关系可以这样理解:随机 梯度下降方法以损失很小的一部分精确度和增 加一定数量的迭代次数为代价,换取了总体的 优化效率的提升。增加的迭代次数远远小于样 本的数量。
2. 牛顿法和拟牛顿法(Newton's method & Quasi-Newton Methods)
牛顿法(Newton's method) 牛顿法是一种在实数域和复数域上近似求解方程 的方法。方法使用函数 f ( x ) 的泰勒级数的前 面几项来寻找方程 f ( x ) = 0 的根。牛顿法最大 的特点就在于它的收敛速度很快。
具体步骤:
首先,选择一个接近函数 f ( x ) 零点的 x 0 , 计算相应的 f ( x 0 ) 和切线斜率 f ' (x 0 ) (这 里 f ' 表示函数 f 的导数)。然后我们计算穿 过点 (x 0 , f (x 0 )) 并且斜率为 f '(x 0 ) 的直线 和 x 轴的交点的 x 坐标,也就是求如下方程的 解:
批量梯度下降法(Batch Gradient Descent,BGD)
(1)将J(theta)对theta求偏导,得到每个theta对应 的的梯度:
(2)由于是要最小化风险函数,所以按每个参数 theta的梯度负方向,来更新每个theta:
(3)从上面公式可以注意到,它得到的是一个全 局最优解,但是每迭代一步,都要用到训练集 所有的数据,如果m很大,那么可想而知这种 方法的迭代速度会相当的慢。所以,这就引入 了另外一种方法——随机梯度下降。 对于批量梯度下降法,样本个数m,x为n维向 量,一次迭代需要把m个样本全部带入计算, 迭代一次计算量为m*n 2 。

最优化理论与方法

最优化理论与方法

最优化理论与方法综述李超雄最优化方法是近几十年形成的,它主要运用数学方法研究各种系统的优化途径及方案,为决策者提供科学决策的依据。

最优化方法的主要研究对象是各种管理问题及其生产经营活动。

最优化方法的目的在于针对所研究的系统,求得一个合理运用人力、物力和财力的最佳方案,发挥和提高系统的效能及效益,最终达到系统的最优目标。

实践表明,随着科学技术的日益进步和生产经营的日益发展,最优化方法已成为管理科学的重要理论基础和不可缺少的方法,被人们广泛地应用到公共管理、经济管理、工程建设、国防等各个领域,发挥着越来越重要的作用。

这就是我理解的整个课程的流程。

在这整个学习的过程当中,当然也会遇到很多的问题,不论是从理论上的还是从实际将算法编写出程序来解决一些问题。

下面给出学习该课程的必要性及结合老师讲解以及在作业过程中遇到的问题来阐述自己对该课程的理解。

20世纪40年代以来,由于生产和科学研究突飞猛进地发展,特别是电子计算机日益广泛应用,使最优化问题的研究不仅成为一种迫切需要,而且有了求解的有力工具。

因此最优化理论和算法迅速发展起来,形成一个新的学科。

至今已出现线性规划、整数规划、非线性规划、几何规划、动态规划、随机规划、网络流等许多分文。

最优化理论与算法包括线性规划单纯形方法、对偶理论、灵敏度分析、运输问题、内点算法、非线性规划K-T条件、无约束最优化方法、约束最优化方法、参数线性规划、运输问题、线性规划路径跟踪法、信赖域方法、二次规划路径跟踪法、整数规划和动态规划等内容。

最优化理论所研究的问题是讨论在众多的方案中什么样的方案最优以及怎样找出最优方案。

这类问题普遍存在。

例如,工程设计中怎样选择设计参数,使得设计方案满足设计要求,又能降低成本;资源分配中,怎样分配有限资源,使得分配方案既能满足各方面的基本要求,又能获得好的经济效益;生产评价安排中,选择怎样的计划方案才能提高产值和利润;原料配比问题中,怎样确定各种成分的比例,才能提高质量,降低成本;城建规划中,怎样安排基本单位的合理布局,才能方便群众,有利于城市各行各业的发展;农田规划中,怎样安排各种农作物的合理布局,才能保持高产稳产,发挥地区优势;军事指挥中,怎样确定最佳作战方案,才能有效地消灭敌人,保存自己,有利于战争的全局;在人类活动的各个领域中,诸如此类,不胜枚举。

最优化算法实验2-0.618法与斐波那契法

最优化算法实验2-0.618法与斐波那契法

0.618法(斐波那契法)的Matlab 实现实验目的:1、通过本次实验了解线性搜索,加深对试探法的理解2、根据0.618法(斐波那契法)的算法步骤编写相应的Matlab 程序,并利用matlab 程序计算求解实验要求:1、学习MATLAB 利用0.618法(斐波那契法)解决最优化问题的程序设计方法。

2、对问题进行编程和解决问题。

3、按照格式规范,撰写计算机实践报告。

实验内容:1. 0.618法的基本思想:通过取代试探点和进行函数值的比较,使包含极小点的搜索区间不断缩短,当区间长度缩短到一定程度时,区间上各点的函数值均接近极小值点的近似。

使用前提:要求所考虑区间上的目标函数是单峰函数,即在这个区间上只有一个局部极小点的函数。

2.算法步骤:步 1.选取初始数据。

确定初始搜索区间[]11,b a 和精确要求t>0,设置初始试探点11,μλ,)(618.0)(382.011111111a b a a b a -+=-+=μλ计算。

,令和1)()(11=k μϕλϕ 步 2.比较目标函数值。

若)(1λϕ>)(1μϕ,转步3;否则转步4。

步 3.若t b k k ≤-λ,则停止计算,输出k μ;否则,令:)(618.0:),(:)(,:,:,:111111k k k k k k k k k k k k a b a b b a -+=====++++++μμϕλϕμλλ计算)(11+k μϕ,转步2。

步4.若t a k k ≤-μ,则停止计算,输出k λ;否则,令)(382.0:),(:)(,:,:,:111111k k k k k k k k k k k k a b a b a a -+=====++++++λλϕμϕλμμ计算)(11+k λϕ,转步2。

3.编写0.618法Matlab 程序求解最优化问题y=cos3x 在区间[1,2]上的最优值.4.参照0.618法算法为例编写菲波那切法Matlab 程序.。

常见的优化算法

常见的优化算法

常见的优化算法
摘要:
1.优化算法的定义和分类
2.最大化和最小化问题
3.梯度下降法
4.牛顿法
5.拟牛顿法
6.共轭梯度法
7.遗传算法
8.模拟退火算法
9.人工神经网络
正文:
优化算法是数学和计算机科学的一个分支,主要研究如何找到一个函数的最小值或最大值。

在实际应用中,优化问题可以分为最大化和最小化两种类型。

为了求解这类问题,人们研究了许多优化算法,下面我们来介绍一些常见的优化算法。

首先,我们来了解一些基本的优化算法。

梯度下降法是一种非常常见的优化算法,它通过计算目标函数的梯度来不断更新参数,从而使函数值逐渐下降。

牛顿法和拟牛顿法则是基于牛顿- 莱布尼茨公式来求解优化问题的方法,它们具有比梯度下降法更快的收敛速度。

共轭梯度法则是一种高效的线性规划算法,它可以在保证解全局收敛的同时,大幅提高求解速度。

除了这些传统的优化算法,还有一些新兴的优化算法。

遗传算法是一种模
拟自然界生物进化过程的优化方法,它通过基因的遗传、变异和选择来逐步改进解的质量。

模拟退火算法则是一种模拟金属冶炼过程的优化算法,它通过模拟金属冶炼过程中的退火过程来寻找全局最优解。

人工神经网络是一种模拟人脑神经网络进行信息处理的优化算法,它通过调整神经网络中的权重和阈值来逼近目标函数。

总之,优化算法是解决实际问题的重要工具,不同的优化算法适用于不同的问题。

了解这些算法的原理和特点,可以帮助我们更好地选择合适的方法来求解实际问题。

最优化问题的算法迭代格式

最优化问题的算法迭代格式

最优化问题的算法迭代格式最优化问题的算法迭代格式最优化问题是指在一定的条件下,寻找使某个目标函数取得极值(最大值或最小值)的变量取值。

解决最优化问题的方法有很多种,其中较为常见的是迭代法。

本文将介绍几种常用的最优化问题迭代算法及其格式。

一、梯度下降法梯度下降法是一种基于负梯度方向进行搜索的迭代算法,它通过不断地沿着目标函数的负梯度方向进行搜索,逐步接近极值点。

该方法具有收敛速度快、易于实现等优点,在许多应用领域中被广泛使用。

1. 算法描述对于目标函数 $f(x)$,初始点 $x_0$ 和学习率 $\alpha$,梯度下降算法可以描述为以下步骤:- 计算当前点 $x_k$ 的梯度 $\nabla f(x_k)$;- 更新当前点 $x_k$ 为 $x_{k+1}=x_k-\alpha\nabla f(x_k)$;- 如果满足停止条件,则输出结果;否则返回第 1 步。

2. 算法特点- 沿着负梯度方向进行搜索,能够快速收敛;- 学习率的选择对算法效果有重要影响;- 可能会陷入局部极小值。

二、共轭梯度法共轭梯度法是一种基于线性方程组求解的迭代算法,它通过不断地搜索与当前搜索方向共轭的新搜索方向,并在该方向上进行一维搜索,逐步接近极值点。

该方法具有收敛速度快、内存占用少等优点,在大规模问题中被广泛使用。

1. 算法描述对于目标函数 $f(x)$,初始点 $x_0$ 和初始搜索方向 $d_0$,共轭梯度算法可以描述为以下步骤:- 计算当前点 $x_k$ 的梯度 $\nabla f(x_k)$;- 如果满足停止条件,则输出结果;否则进行下一步;- 计算当前搜索方向 $d_k$;- 在当前搜索方向上进行一维搜索,得到最优步长 $\alpha_k$;- 更新当前点为 $x_{k+1}=x_k+\alpha_k d_k$;- 计算新的搜索方向 $d_{k+1}$;- 返回第 2 步。

2. 算法特点- 搜索方向与前面所有搜索方向都正交,能够快速收敛;- 需要存储和计算大量中间变量,内存占用较大;- 可以用于非线性问题的求解。

(完整版)机械优化设计习题参考答案孙靖民第四版机械优化设计

(完整版)机械优化设计习题参考答案孙靖民第四版机械优化设计
1.Fibonacci法—理想方法,不常用。
2.黄金分割法(0.618法)
原理:提高搜索效率:1)每次只插一个值,利用一个前次的插值;2)每次的缩短率λ相同。左右对称。
程序:p52
(四)插值方法
1.抛物线法
原理:任意插3点:
算得: ; ;
要求:
设函数 用经过3点的抛物线 代替,有
解线代数方程
解得:
程序框图p57
网格法 ,缩小区间,继续搜索。
Monte Carlo方法 , ,随机数。
比较各次得到的 得解
遗传算法(专题)
(二)区间消去法(凸函数)
1.搜索区间的确定:高—低--高( )则区间内有极值。
2.区间消去法原理:在区间[a, b]内插两个点a1, b1保留有极值点区间,消去多余区间。
缩短率:
(三)0.618法
可行方向—约束允许的、函数减小的方向。(图)约束边界的切线与函数等高线的切线方向形成的区域。
数学模型
用内点法或混合法,取 ,
直接方法
(一)随机方向法
1.在可行域产生一个初始点 ,因 (约束),则
--(0,1)的随机数。
2.找k个随机方向,每个方向有n个方向余弦,要产生kn个随机数 , , ,随机方向的单位向量为
3.取一试验步长 ,计算每个方向的最优点
4.找出可行域中的最好点 得搜索方向 。以 为起点, 为搜索方向得 。最优点必须在可行域内或边界上,为此要逐步增加步长。

穷举下去得递推公式
3.算例
p73
4.框图p72
5.特点
作业:1. 2.
(六)变尺度法
1.引言
坐标变换
二次函数
令 为尺度变换矩阵

最优控制的计算方法

最优控制的计算方法
(2) 的第K步估计值 和给定的 合在一起,从 积分正则方程,求出 ,抽出n个要求的分量的终值 ,若 ,停止计算,否则进行下一步。
可得
3、将 代入协态方程,且由边界条件 从t=1倒向积分可得 这里选步长因子 。如此继续下去,直至指标函数随迭代变化很小为止。 由 ,得
图b 最优状态的求解
图a 用梯度法寻找最优控制 右图表示了控制和状态的初始值和第一次迭代值,可以看到第一次迭代 就几乎收敛到最优值, 与最优值还有差异,而且一般说来愈接近最优值收敛愈慢。
K=1时时,控制量为
所以,这个例子只要两步迭代即可得到最优解。一般说来,共轭梯度法比梯度法收敛快,但接近最优解后收敛性仍是较慢的。一个补救办法是重新启动,即找出几个共轭梯度方向 后,令 ,再重新迭代,寻找共轭梯度方向。
可以证明 ,即为最优控制。这只要证明
2、共轭梯度法
*
用共轭梯度法寻找最优控制时是沿着所谓共轭梯度向量的方向进行的。为了说明共轭梯度的意义,我们先从求函数极值问题的共轭梯度法开始,再推广到求泛函极值问题。
(1) 求函数极值的共轭梯度法
其中,
C为常数, Q为正定阵。
要求寻找X使F(X)取极值。
设F(X)是定义在Rn空间中的二次指标函数
直接法的特点是,在每一步迭代中,U(t)不一定要满足H 取极小的必要条件,而是逐步改善它,在迭代终了使它满足这个必要条件,而且,积分状态方程是从t0到tf ,积分协态方程是从tf到t0,这样就避免了去寻找缺少的协态初值(t0)的困难。常用的直接法有梯度法,二阶梯度法,共轭梯度法。
间接法的特点是,在每一步迭代中都要满足H取极小的必要条件,而且要同时积分状态方程和协态方程,两种方程的积分都从从t0到tf或从tf到t0 。常用的间接法有边界迭代法和拟线性化法。

最优化方法复习大纲PPT课件

最优化方法复习大纲PPT课件

2 0 2 0 0 12
问:(1)确定当前单纯型表中的基变量,基本可行解,
目标函数值。
(2)判断其是否为最优单纯型表,是则给出理由;不是, 则继续求解该问题的最优解。
10
解:
(1)基变量为 x2 , x4 , x5 ,基本可行解为 x1 (0,4,0,2,6)T 。 目标函数值为12。
(2)因为变量 x1 的检验数 1 2 0 ,所以不是最优单纯
题的最优解计算. 6. 模式搜索法:计算。
7. 最优性条件: 积极约束判断,K-T条件, K-T点 判别。
8. 惩罚函数法: 外点法惩罚函数的构造,内点法 障碍函数的构造,外点法、内点法计算。
2
9. 线性规划: 建立线性规划模型,化标准型,基 本可行解的计算,单纯型表上的单纯型算法.
3
例1. 试用梯度法解下述问题 min f ( x) x12 4 x22
min z 2 x1 x2 3 x3
x1 x2 2 x3 4
s.t .
2 x1 x3 2 2x2 x3 5
x1 , x2 0, x3无约束
解: 令 x3 x4 x5 .
max z 2 x1 x2 3 x4 3 x5
x1 x2 2 x4 2 x5 x6 4
已知初始点 x1 (1,1)T ,求迭代点x2。
解: f ( x) [ 2x1 ,8x2 ]T d1 f ( x1) [ 2, 8]T
x x1 d1 [1 2,1 8]T
记 ( ) f ( x1 d1) (1 2 )2 4(1 8 )2
令 '( ) 4(1 2 ) 64(1 8 ) 0
最优化方法复习提纲
一、概念
最优化问题,凸集,凸函数,局部极小点, 全局极小点,下降方向,最优步长,共轭方 向,可行方向,积极约束,线性规划问题, 基本解。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最优化方法程序作业专业:油气储运工程班级:姓名:学号:一、开发工具该应用程序采用的开发工具是Visual studio 2005,编程语言使用的是C#。

二、程序代码(1)0.618法和抛物线法求ψ(t)=sint,初始点t0=1①主程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;public partial class_Default : System.Web.UI.Page{JiSuan JS = new JiSuan();protected void Button1_Click(object sender, EventArgs e){double xx0 = 0.01;//步长double tt0 = 1, pp = 2, qq = 0.5;ArrayList list1 = new ArrayList();list1 = (ArrayList)JS.SuoJian(xx0, tt0, pp, qq);//调用倍增半减函数double aa = double.Parse(list1[0].ToString());double bb = double.Parse(list1[1].ToString());txtShangxian.Text = bb.ToString();//在页面上显示极小区间txtXiaxian.Text = aa.ToString();ArrayList list2 = new ArrayList();list2 = (ArrayList)JS.JiXiao1(aa, bb);//调用0.618法函数double jixiao1 = double.Parse(list2[0].ToString());double fjixiao1 = double.Parse(list2[1].ToString());txtJixiao1.Text = jixiao1.ToString();//在页面上显示极小点txtFjixiao1.Text = fjixiao1.ToString();//在页面上显示极小点处的函数值ArrayList list3 = new ArrayList();list3 = (ArrayList)JS.JiXiao2(aa, bb);//调用抛物线法函数double jixiao2 = double.Parse(list3[0].ToString());double fjixiao2 = double.Parse(list3[1].ToString());txtJixiao2.Text = jixiao2.ToString();//在页面上显示极小点txtFjixiao2.Text = fjixiao2.ToString();//在页面上显示极小点处的函数值 }}②各个子函数的程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;///<summary>/// JiSuan 的摘要说明///</summary>public class JiSuan{public JiSuan(){//// TODO: 在此处添加构造函数逻辑//}//目标函数public double f(double z){double zz = Math.Sin(z);return zz;}//倍增半减函数public ArrayList SuoJian(double x0, double t0, double p, double q){double t1;double f0, f1;double x1, t2;double f2;double a = 0, b = 0, c = 0;double fa, fc, fb;double t3, f3;bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;t1 = t0 + x0;f0 = f(t0);//调用目标函数f1 = f(t1);if (f0 > f1){while (biaozhi1){x1 = p * x0;t2 = t1 + x1;f2 = f(t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t0;c = t1;b = t2;fa = f0;fc = f1;fb = f2;break;}}}else{t3 = t1;f3 = f1;t1 = t0;f1 = f0;t0 = t3;f0 = f3;while (biaozhi2){x1 = q * x0;t2 = t1 - x1;f2 = f(t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t2;c = t1;b = t0;fa = f2;fc = f1;fb = f0;break;}}}ArrayList list = new ArrayList();list.Add(a);list.Add(b);return list;}//0.618法函数public ArrayList JiXiao1(double a, double b) {double jd = 0.0001;//精度double p = 0.618;double t1, t2;double f1, f2;double jixiao=0;//极小点bool biaozhi1 = true;//设置是否循环标志bool biaozhi2 = true;while (biaozhi1){t1 = a + (1 - p)*(b - a);t2 = a + p * (b - a);f1 = f(t1);//调用目标函数f2 = f(t2);while (biaozhi2){if (f1 < f2){b = t2;t2 = t1;f2 = f1;t1 = a + (1 - p)*(b - a); f1 = f(t1);//调用目标函数if (Math.Abs(b - a) > jd) {continue;}else{biaozhi1 = false;break;}}else if (f1 == f2){a = t1;b = t2;if (Math.Abs(b - a) > jd) {break;}else{biaozhi1 = false;break;}}else if (f1 > f2){a = t1;t1 = t2;f1 = f2;t2 = a + p * (b - a);f2 = f(t2);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}}}jixiao = (a + b) / 2;double fjixiao = f(jixiao);//调用目标函数ArrayList list = new ArrayList();list.Add(jixiao);list.Add(fjixiao);return list;}//抛物线法函数public ArrayList JiXiao2(double a, double b){double jd = 0.0001;//精度double c = a + (b - a) / 2;//将c的值设为a、b点的中点double fa, fb, fc, c1, c2;double jixiao = 0;//极小点double ta, fta;double fac;bool biaozhi1 = true;//设置是否循环标志while (biaozhi1){fa = f(a);//调用目标函数fb = f(b);fc = f(c);c1 = (fb - fa) / (b - a);c2 = ((fc - fa) / (c - a) - c1) / (c - b);if (c2 == 0){jixiao = c;break;}else{ta = 0.5 * (a + b - (c1 / c2));fta = f(ta);//调用目标函数if (Math.Abs(b - a) <= jd){jixiao = ta;break;}else{if (fc > fta){if (c > ta){b = c;fb = fc;c = ta;fc = fta;continue;}else{a = c;fa = fc;c = ta;fc = fta;continue;}}else if (fc == fta){if (c > ta){a = ta;b = c;c = (c + ta) / 2;fa = fta;fb = fc;fc = f(c);//调用目标函数continue;}else if (c == ta){fac = f((a + c) / 2);//调用目标函数if (fac < fc){c = (a + c) / 2;fc = f(c);//调用目标函数b = ta;fb = fta;continue;}else{a = (a + c) / 2;fa = f(a);//调用目标函数continue;}}else if (c < ta){a = c;c = (c + ta) / 2;b = ta;fa = fc;fb = fta;fc = f(c);//调用目标函数continue;}}else if (fc < fta){if (c > ta){a = ta;fa = fta;continue;}else{b = ta;fb = fta;continue;}}}}}double fjixiao = f(jixiao);//调用目标函数ArrayList list = new ArrayList();list.Add(jixiao);list.Add(fjixiao);return list;}}(2)共轭梯度法求函数极小点:f(x)=1.5x12+0.5x22-x1x2-2x1;初始点为(-2,4)①主程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;public partial class_Default : System.Web.UI.Page{JiSuan JS = new JiSuan();protected void Button1_Click(object sender, EventArgs e){//共轭梯度法求极小值double[] x0 = new double[2];//定义二维数组double[] x = new double[2];x0[0] = -2;x0[1] = 4;double x00 = -2;double x01 = 4;double jd = 0.0001;//精度bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;double y;//定义关于x的函数值double[] g = new double[2];//定义函数在点x处的梯度值double[] p = new double[2];double ggm, ggo=0;double jixiao;double x1=0, x2=0, fy=0;int i;for (int j = 0; j < 2; j++){x[j] = x0[j];}while (biaozhi1){i = 0;while (biaozhi2){y = JS.f(x[0], x[1]);//调用目标函数g[0] = JS.g0(x[0], x[1]);//调用梯度函数,求在点x处的梯度值 g[1] = JS.g1(x[0], x[1]);ggm = g[0] * g[0] + g[1] * g[1];if (ggm <= jd){x1 = x[0];x2 = x[1];fy = y;biaozhi1 = false;break;}else{if (i == 0){p[0] = -g[0];p[1] = -g[1];}else{p[0] = -g[0] + (ggm / ggo) * p[0];p[1] = -g[1] + (ggm / ggo) * p[1];}//调用0.618法子函数,找出极小点jixiao = JS.JiXiao1(x[0], x[1], p[0], p[1], x00, x01); x[0] = x[0] + jixiao * p[0];x[1] = x[1] + jixiao * p[1];ggo = ggm;i++;if (i >= 2){break;}else{continue;}}}}txtx1.Text = x1.ToString();txtx2.Text = x2.ToString();txty.Text = fy.ToString();}}②子函数程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;///<summary>/// JiSuan 的摘要说明///</summary>public class JiSuan{public JiSuan(){//// TODO: 在此处添加构造函数逻辑//}//目标函数public double f(double z1,double z2){double zz = 1.5 * z1 * z1 + 0.5 * z2 * z2 - z1 * z2 - 2 * z1;return zz;}//求梯度值函数public double g0(double z1, double z2){double zz = 3 * z1 - z2 - 2;return zz;}public double g1(double z1, double z2){double zz = z2 - z1;return zz;}//倍增半减函数public ArrayList SuoJian(double x0, double t0, double p, double q, double xx0, double xx1, double p0, double p1,double x00,double x01){double t1;double f0, f1;double x1, t2;double f2;double a = 0, b = 0, c = 0;double fa, fc, fb;double t3, f3;bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;double x_0t1, x_1t1, x_0t2, x_1t2;x_0t1 = xx0 + t1 * p0;x_1t1 = xx1 + t1 * p1;f0 = f(x00, x01);//调用目标函数f1 = f(x_0t1, x_1t1);if (f0 > f1){while (biaozhi1){x1 = p * x0;t2 = t1 + x1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t0;c = t1;b = t2;fa = f0;fc = f1;fb = f2;break;}}}else{t3 = t1;f3 = f1;t1 = t0;f1 = f0;t0 = t3;while (biaozhi2){x1 = q * x0;t2 = t1 - x1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t2;c = t1;b = t0;fa = f2;fc = f1;fb = f0;break;}}}ArrayList list = new ArrayList();list.Add(a);list.Add(b);return list;}//0.618法函数public double JiXiao1(double x0, double x1, double p0, double p1,double x00,double x01){double jd = 0.0001;//精度double p = 0.618;double t1, t2;double jixiao = 0;//极小点bool biaozhi1 = true;//设置是否循环标志bool biaozhi2 = true;double xx0 = 0.01;//步长double tt0 = 0, pp = 2, qq = 0.5;double x_0t1, x_1t1, x_0t2, x_1t2;ArrayList list1 = new ArrayList();//调用倍增半减函数获取极小区间list1 = (ArrayList)SuoJian(xx0, tt0, pp, qq, x0, x1, p0, p1, x00, x01);double a = double.Parse(list1[0].ToString());double b = double.Parse(list1[1].ToString());while (biaozhi1){t1 = a + (1 - p) * (b - a);t2 = a + p * (b - a);x_0t1 = x00 + t1 * p0;x_1t1 = x01 + t1 * p1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f1 = f(x_0t1, x_1t1);//调用目标函数f2 = f(x_0t2, x_1t2);while (biaozhi2){if (f1 < f2){b = t2;t2 = t1;f2 = f1;t1 = a + (1 - p) * (b - a);x_0t1 = x00 + t1 * p0;x_1t1 = x01 + t1 * p1;f1 = f(x_0t1, x_1t1);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}else if (f1 == f2){a = t1;b = t2;if (Math.Abs(b - a) > jd){break;}else{biaozhi1 = false;break;}}else if (f1 > f2){a = t1;t1 = t2;f1 = f2;t2 = a + p * (b - a);x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}}}jixiao = (a + b) / 2;return jixiao;}}三、程序运行界面及结果(1)0.618法和抛物线法求ψ(t)=sint,初始点t0=1(2)共轭梯度法求函数极小点:f(x)=1.5x12+0.5x22-x1x2-2x1;初始点为(-2,4)。

相关文档
最新文档