導航:首頁 > 編程語言 > 最速下降法c程序

最速下降法c程序

發布時間:2023-08-23 05:58:25

① 最速下降法的c語言編程,急求大神

// this program made by lusiyuan

#include<stdio.h>

#include<math.h>

#define N 10

#define eps pow(10,-6)

double f(double x[],double g[],double t)

{

double s;

s=pow(x[0]-t*g[0],2)+4*pow(x[1]-t*g[1],2);

return s;

}

void sb(double *a,double *b,double x[],double g[])

{

double t0,t1,t,h,alpha,f0,f1;

int k=0;

t0=10; /*初始值*/

h=1; /*初始步長*/

alpha=2; /*加步系數*/

f0=f(x,g,t0);

t1=t0+h;

f1=f(x,g,t1);

while(1)

{

if(f1<f0)

{

h=alpha*h; t=t0;

t0=t1; f0=f1;

k++;

}

else

{

if(k==0)

{h=-h;t=t1;}

else

{

*a=t<t1?t:t1;

*b=t>t1?t:t1;

break;

}

}

t1=t0+h;

f1=f(x,g,t1);

}

}

double hjfg(double x[],double g[])

{

double beta,t1,t2,t;

double f1,f2;

double a=0,b=0;

double *c,*d;

c=&a,d=&b;

sb(c,d,x,g);

printf("\n[a,b]=[%lf,%lf]",a,b);

beta=(sqrt(5)-1.0)/2;

t2=a+beta*(b-a); f2=f(x,g,t2);

t1=a+b-t2; f1=f(x,g,t1);

while(1)

{

if(fabs(t1-t2)< eps)

break;

else

{

if(f1<f2)

{

t=(t1+t2)/2; b=t2;

t2=t1; f2=f1;

t1=a+b-t2; f1=f(x,g,t1);

}

else

{

a=t1; t1=t2;

f1=f2; t2=a+beta*(b-a);

f2=f(x,g,t2);

}

}

}

t=(t1+t2)/2;

return t;

}

void zsxjf()

{

double x[N],g[N],t=0,f0,mod;

int i,n;

printf("請輸入n(為幾元函數)=");

scanf("%d",&n);

printf("\n請輸入初始值:\n");

for(i=0;i<n;i++)

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

f0=f(x,g,t);

g[0]=2*x[0]; g[1]=8*x[1];

t=hjfg(x,g);

printf("\nt=%lf",t);

while(1)

{

mod=sqrt(pow(g[0],2)+pow(g[1],2));

printf("\nmod=%lf",mod);

if(mod<eps)

break;

else

{

x[0]=x[0]-t*g[0];

x[1]=x[1]-t*g[1];

f0=f(x,g,t);

g[0]=2*x[0];

g[1]=8*x[1];

t=hjfg(x,g);

}

printf("\n-----------------------------------------------");

printf("\nt=%lf",t);

}

printf("\n最優解為:x%d=%lf,x%d=%lf",1,x[0],2,x[1]);

printf("\n函數最有值為:f=%lf",f(x,g,t));

}

int main()

{

zsxjf();

}
編譯通過,這種代碼很好寫的。

② 請教高手幫忙編程序~~用matlab編寫數值優化方法(最速下降法,懲罰函數法),具體題目如下:

例1 求 f = 2 在0<x<8中的最小值與最大值
主程序為wliti1.m:
f='2*exp(-x).*sin(x)';
fplot(f,[0,8]); %作圖語句
[xmin,ymin]=fminbnd (f, 0,8)
f1='-2*exp(-x).*sin(x)';
[xmax,ymax]=fminbnd (f1, 0,8)
運行結果:
xmin = 3.9270 ymin = -0.0279
xmax = 0.7854 ymax = 0.6448
★(藉助課件說明過程、作函數的圖形)
例2 對邊長為3米的正方形鐵板,在四個角剪去相等的正方形以製成方形無蓋水槽,問如何剪法使水槽的容積最大?
設剪去的正方形的邊長為x,則水槽的容積為: ,建立無約束優化模型為:min y=- , 0<x<1.5
先編寫M文件fun0.m如下:
function f=fun0(x)
f=-(3-2*x).^2*x;
主程序為wliti2.m:
[x,fval]=fminbnd('fun0',0,1.5);
xmax=x
fmax=-fval
運算結果為: xmax = 0.5000,fmax =2.0000.即剪掉的正方形的邊長為0.5米時水槽的容積最大,最大容積為2立方米.
★(藉助課件說明過程、作函數的圖形、並編制計算程序)
例3
1、編寫M-文件 fun1.m:
function f = fun1 (x)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);

2、輸入M文件wliti3.m如下:
x0 = [-1, 1];
x=fminunc(『fun1』,x0);
y=fun1(x)
3、運行結果:
x= 0.5000 -1.0000
y = 1.3029e-10
★(藉助課件說明過程、作函數的圖形並編制計算程序)
例4 Rosenbrock 函數 f(x1,x2)=100(x2-x12)2+(1-x1)2 的最優解(極小)為x*=(1,1),極小值為f*=0.試用不同演算法(搜索方向和步長搜索)求數值最優解.初值選為x0=(-1.2 , 2).
為獲得直觀認識,先畫出Rosenbrock 函數的三維圖形, 輸入以下命令:
[x,y]=meshgrid(-2:0.1:2,-1:0.1:3);
z=100*(y-x.^2).^2+(1-x).^2;
mesh(x,y,z)
畫出Rosenbrock 函數的等高線圖,輸入命令:
contour(x,y,z,20)
hold on
plot(-1.2,2,' o ');
text(-1.2,2,'start point')
plot(1,1,'o')
text(1,1,'solution')
f='100*(x(2)-x(1)^2)^2+(1-x(1))^2';
[x,fval,exitflag,output]=fminsearch(f, [-1.2 2])
運行結果:
x =1.0000 1.0000
fval =1.9151e-010
exitflag = 1
output =
iterations: 108
funcCount: 202
algorithm: 'Nelder-Mead simplex direct search'
★(藉助課件說明過程、作函數的圖形並編制計算程序)
(五)、 作業
陳酒出售的最佳時機問題
某酒廠有批新釀的好酒,如果現在就出售,可得總收入R0=50萬元(人民幣),如果窖藏起來待來日(第n年)按陳酒價格出售,第n年末可得總收入 (萬元),而銀行利率為r=0.05,試分析這批好酒窖藏多少年後出售可使總收入的現值最大. (假設現有資金X萬元,將其存入銀行,到第n年時增值為R(n)萬元,則稱X為R(n)的現值.)並填下表:

③ 用MATLAB解決最小二乘解的題

這個題目本質上就是個二次函數的求極值問題。
(1)首先將式子化簡
如圖
(2)代入下列函數中函數中
2.1
最速下降法子函數(代碼)
2.2
擬牛頓法(對秩1
子函數代碼)
2.3
bfgs子函數代碼
2.3
dfp(子函數代碼)
(3)上述過程包含了計算的步驟,可以用optimtool設置方法來求解並得到過程。本來想給你結果的,分數太少,就不寫上去了。

閱讀全文

與最速下降法c程序相關的資料

熱點內容
ca證書管理器linux 瀏覽:358
蘋果id安全提示問題3個字元 瀏覽:949
iphone上好的拍照軟體 瀏覽:579
word內嵌文件怎麼下載 瀏覽:864
8s16升級 瀏覽:340
計算機網路技術基礎pdf 瀏覽:544
javafrom提交地址參數 瀏覽:721
git發布版本 瀏覽:728
vc修改文件名 瀏覽:149
linux65從域 瀏覽:321
用什麼東西壓縮文件 瀏覽:406
怎麼刪除ipad隱藏的APP 瀏覽:981
編程如何佔用大量內存 瀏覽:116
多個excel表格文件如何組合 瀏覽:918
ubuntu內核升級命令 瀏覽:679
pgp文件夾 瀏覽:894
一鍵還原的文件是什麼格式 瀏覽:581
女漢子微信名霸氣十足 瀏覽:65
win10手機藍屏修復 瀏覽:419
windows2008激活工具 瀏覽:259

友情鏈接