




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1.最速下降法#include "stdio.h"#include "math.h"double fun1(double x1,double x2) /*定義函數(shù)fun1為目標(biāo)函數(shù)*/double y; y=x1*x1-2*x1*x2+4*x2*x2+x1-3*x2; return y;void main() double t, x1=1, x2=1,e=0.01, g2, y, m; int k=1; /*定義起始點(diǎn)為x1=0,x2=1,并定義精度為e=0.01*/ g0=2*x1-2*x2+1; /*目標(biāo)函數(shù)對x1求偏導(dǎo)*/ g1=(-2)*x1+8
2、*x2-3; /*目標(biāo)函數(shù)對x2求偏導(dǎo)*/ m=(sqrt(g0*g0+g1*g1); /*對g0*g0+g1*g1求開方,將值賦給m*/ while(m>e&&k<=200) /*判斷,當(dāng)m>e時(shí)進(jìn)行以下循環(huán)*/ t=(2*g1-2*g0)*x1+(2*g0-8*g1)*x2-g0+3*g1)/(4*g0*g1-2*g0*g0-8*g1*g1); /*根據(jù)梯度法(最速下降法),利用梯度和海賽矩陣*/ x1=x1-g0*t; /*求步長t。 根據(jù)步長和梯度方向求出新的x1,x2*/ x2=x2-g1*t;printf("迭代次數(shù)%dn",k
3、);printf("搜索方向-%f,-%f,負(fù)梯度的模%f,步長%fn",g0,g1,m,t);printf("x的值%f,%fn",x1,x2); g0=2*x1-2*x2+1; g1=(-2)*x1+8*x2-3; m=(sqrt(g0*g0+g1*g1); /*計(jì)算新的m*/ printf("新的負(fù)梯度的模%fn",m); k+; y=fun1(x1,x2); /*當(dāng)m不滿足m>e的時(shí)候退出循環(huán),并計(jì)算fun1,*/ printf("分別輸出x1,x2 %f,%fn",x1,x2); /*將值賦給y,并
4、輸出。*/ printf("極小值y%f",y);2.FR共軛梯度法#include "stdio.h"#include "math.h"double fun1(double x1,double x2) /*定義函數(shù)fun1為目標(biāo)函數(shù)*/double y; y=x1*x1-2*x1*x2+4*x2*x2+x1-3*x2; return y;double fun2(double g,double d) /*定義函數(shù)fun2為求步長的函數(shù)*/ double buchang; buchang=-(g0*d0+g1*d1)/(d0*(2*d0
5、-2*d1)+d1*(-2)*d0+8*d1); return buchang;void main() double t, beta, x1=1, x2=1, d2,g4, y, m,e=0.01; /*定義起始點(diǎn)為x1=0,x2=1,并定義精度為e=0.01*/int k=1; g0=2*x1-2*x2+1; /*目標(biāo)函數(shù)對x1求偏導(dǎo)*/ g1=(-2)*x1+8*x2-3; /*目標(biāo)函數(shù)對x2求偏導(dǎo),求梯度*/ m=(sqrt(g0*g0+g1*g1); /*對g0*g0+g1*g1求開方,將值賦給m*/ while(m>e&&k<=200) /*判斷,當(dāng)m&g
6、t;e時(shí)進(jìn)行以下循環(huán)*/ if (k=1) d0=-g0; d1=-g1; beta=0; /*計(jì)算因子beta*/elsebeta=(g0*g0+g1*g1)/(g2*g2+g3*g3); /*計(jì)算因子beta*/ d0=-g0+beta*d0; d1=-g1+beta*d1; t=fun2(g,d); /*計(jì)算步長*/ x1=x1+d0*t; /*根據(jù)步長和搜索方向求出新的x1,x2*/ x2=x2+d1*t;printf("迭代次數(shù)為%dn",k); printf("梯度%f,%f,梯度的模%fn",g0,g1,m);printf("搜索
7、方向%f,%f,計(jì)算因子 %f,步長%fn",d0,d1,beta,t);printf("x的值%f,%fn",x1,x2); g2=g0;g3=g1; g0=2*x1-2*x2+1; /*根據(jù)得到的x1,x2求出新的梯度,并將值*/ g1=(-2)*x1+8*x2-3; /*賦給g0,g1,*/ m=double(sqrt(g0*g0+g1*g1); /*計(jì)算新的m*/ printf("新的負(fù)梯度的模%fn",m);k+; y=fun1(x1,x2); /*當(dāng)m不滿足m>e的時(shí)候退出循環(huán),并計(jì)算fun1,*/ printf("
8、分別輸出x1,x2 %f,%fn",x1,x2); /*將值賦給y,并輸出。*/ printf("極小值y %f",y); 3.DFP法#include<math.h>#include<stdio.h>#include<stdlib.h># define e 0.01double fun1 (double x) /*定義目標(biāo)函數(shù)為fun1函數(shù)*/ return (double)pow(x0,2)+4*pow(x1,2)-2*x0*x1+x0-3*x1;void fun2 (double x,double g_x) /*定義求梯度
9、函數(shù)為fun2函數(shù)*/ g_x0 = (double)2*x0-2*x1+1; g_x1 = (double)8*x1-2*x0-3;void fun3 (double h, double g, double d) /*定義求搜索方向函數(shù)為fun3函數(shù)*/ d0 = -(h0*g0+h1*g1); d1 = -(h2*g0+h3*g1);double fun4 ( double x, double d) /*定義求步長函數(shù)為fun4函數(shù)*/ return -(2*x0*d0+8*x1*d1-2*x0*d1-2*x1*d0+d0-3*d1) / (2*d0*d0+8*d1*d1-4*d0*d1)
10、; void fun5(double h,double x,double tx,double g_x,double tg ) /*定義求H矩陣函數(shù)為fun5函數(shù)*/ double q2,p2,temp2,th4; q0 = tg0 - g_x0; /*第k+1個(gè)點(diǎn)梯度與第k個(gè)點(diǎn)處的梯度之差*/ q1 = tg1 - g_x1; p0 = tx0 - x0; /*p(k),第k+1個(gè)點(diǎn)與第k個(gè)點(diǎn)的點(diǎn)差 */ p1 = tx1 - x1; th0 = h0; /*用臨時(shí)變量儲存原H矩陣的值*/ th1 = h1; th2 = h2; th3 = h3; temp0 = p0 * q0 + p1 *
11、 q1; temp1 = (q0 * h0 + q1 * h2) * q0 + (q0 * h1 + q1 * h3) * q1; h0 = th0 + pow(p0,2) / temp0 - pow(th0 * q0 + th1 * q1),2) / temp1; h1 = th1 + (p0 * p1) / temp0 - (th0 * q0 + th1 * q1) * (th2 * q0+ th3 * q1) / temp1; h2 = th2 + (p0 * p1) / temp0 - (th0 * q0 + th1 * q1) * (th2 * q0+ th3 * q1) / tem
12、p1; h3 = th3 + pow(p1,2) / temp0 - pow(th2 * q0 + th3 * q1),2) / temp1;void main()int k=1; double x2 = 1 , 1, /*計(jì)算初始點(diǎn)*/tx2 = 1 , 1, /*臨時(shí)存儲計(jì)算點(diǎn)*/g_x2, /*梯度*/tg2, /*臨時(shí)梯度*/t, /*步長*/d2, /*搜索方向*/h4 = 1, 0, 0, 1; /*初始H矩陣*/double fx = 0; fun2(x,g_x); /*求梯度*/ tg0=g_x0;tg1=g_x1;fun3(h, g_x, d); /*求搜索方向*/int c
13、ounter=1; while(sqrt(pow(g_x0,2)+pow(g_x1,2)-e>0) do fun3(h, tg, d); /*求搜索方向*/ t = fun4( x, d); /*求步長*/printf("n迭代次數(shù)為%dn",counter+);printf("梯度%f,%f,梯度的模%fn",g_x0,g_x1, sqrt(pow(g_x0,2)+pow(g_x1,2); printf("搜索方向%f,%f,步長%fn",d0,d1,t);printf("H矩陣n%f,%fn%f,%f",
14、h0,h1,h2,h3); if(k=2) tx0=x0+t*d0;tx1=x1+t*d1; else tx0=tx0+t*d0; tx1=tx1+t*d1; fun2( tx, tg); /*求梯度*/ fun5(h, x, tx, g_x, tg);/*H矩陣*/if(k = 2) x0 = tx0;x1 = tx1; printf("nx1=%ftx2=%f",x0,x1);fun2( x, g_x);printf("n新梯度的模:%f",sqrt(pow(g_x0,2)+pow(g_x1,2); k+;while(k=2);k = 1; fx =
15、 fun1( x);printf("n最優(yōu)解為:n");printf("nx1=%f, x2=%fn",x0,x1); printf("n最優(yōu)值為:n"); printf("nf(x)=%f n",fx);4.BFGS法#include<math.h>#include<stdio.h>#include<stdlib.h># define e 0.01double fun1 (double x) /*定義目標(biāo)函數(shù)為fun1函數(shù)*/ return (double)pow(x0,2)+
16、4*pow(x1,2)-2*x0*x1+x0-3*x1;void fun2 (double x,double g_x) /*定義求梯度函數(shù)為fun2函數(shù)*/ g_x0 = (double)2*x0-2*x1+1; g_x1 = (double)8*x1-2*x0-3;void fun3 (double h, double g, double d) /*定義求搜索方向函數(shù)為fun3函數(shù)*/ d0 = -(h0*g0+h1*g1); d1 = -(h2*g0+h3*g1);double fun4 ( double x, double d) /*定義求步長函數(shù)為fun4函數(shù)*/ return -(2
17、*x0*d0+8*x1*d1-2*x0*d1-2*x1*d0+d0-3*d1) / (2*d0*d0+8*d1*d1-4*d0*d1); void fun5(double h,double x,double tx,double g_x,double tg ) /*定義求H矩陣函數(shù)為fun5函數(shù)*/ double q2,p2,temp2,th4; q0 = tg0 - g_x0; /*第k+1個(gè)點(diǎn)梯度與第k個(gè)點(diǎn)處的梯度之差*/ q1 = tg1 - g_x1; p0 = tx0 - x0; /*p(k),第k+1個(gè)點(diǎn)與第k個(gè)點(diǎn)的點(diǎn)差 */ p1 = tx1 - x1; th0 = h0; /*用
18、臨時(shí)變量儲存原H矩陣的值*/ th1 = h1; th2 = h2; th3 = h3; temp0 = p0 * q0 + p1 * q1;/pt*q temp1 = (q0 * h0 + q1 * h2) * q0 + (q0 * h1 + q1 * h3) * q1;/qt*H*q h0 =th0+ (1 + temp1/temp0)*(pow(p0,2) / temp0) - (p0*q0*h0+p0*q1*h2)+(h0*q0*p0+h1*q1*p0) /temp0; h1 =th1+ (1 + temp1/temp0)*(p0 * p1) / temp0) - (p0*q0*h1+
19、p0*q1*h3)+(h0*q0*p1+h1*q1*p1) /temp0; h2 =th2+ (1 + temp1/temp0)*(p1 * p0) / temp0) - (p1*q0*h0+p1*q1*h2)+(h2*q0*p0+h3*q1*p0) /temp0; h3 =th3+ (1 + temp1/temp0)*(p1 * p1) / temp0) - (p1*q0*h1+p1*q1*h3)+(h2*q0*p1+h3*q1*p1) /temp0; void main()int k=1; double x2 = 1 , 1, /*計(jì)算初始點(diǎn)*/tx2 = 1 , 1, /*臨時(shí)存儲計(jì)算點(diǎn)*/g_x2, /*梯度*/tg2, /*臨時(shí)梯度*/t, /*步長*/d2, /*搜索方向*/h4 = 1, 0, 0, 1; /*初始H矩陣*/double fx = 0; fun2( x, g_x); /*求梯度*/ tg0=g_x0;tg1=g_x1;fun3(h, g_x, d); /*求搜索方向*/int counter=1;int j=0; while(sqrt(pow(g_x0,2)+pow(g_x1,2)-e>0&&j<2) do printf("n迭代次數(shù)為%dn",
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)用地利用現(xiàn)狀分析
- 室內(nèi)墻面防水施工方案
- 2024年三季度報(bào)湖南地區(qū)A股長期負(fù)債比率排名前十大上市公司
- 2024年三季度報(bào)湖南地區(qū)A股利息支付倍數(shù)排名前十大上市公司
- 堆土施工方案
- 鋼橋梁施工方案
- 2025年餐廳經(jīng)理考試試題及答案
- 2025年專業(yè)培訓(xùn) 測試題及答案
- 6年級上冊數(shù)學(xué)第5單元
- 2025年消防入門考試題及答案
- GB/T 4154-1993氧化鑭
- 水泥混凝土路面試驗(yàn)檢測的要點(diǎn)
- 運(yùn)輸供應(yīng)商年度評價(jià)表
- 室內(nèi)消防及給排水管道安裝施工方案方案
- 無創(chuàng)呼吸機(jī)參數(shù)調(diào)節(jié)課件
- 《過零丁洋》公開課件
- 文件傳閱單范本
- 電工培養(yǎng)計(jì)劃表
- 部編版五年級道德與法治下冊課程綱要
- Q∕SY 02006-2016 PVT取樣技術(shù)規(guī)程
- 初中物理公式MicrosoftWord文檔
評論
0/150
提交評論