最速下降法和牛顿法求最小值点的算法及结果.docx

上传人:b****4 文档编号:4794262 上传时间:2022-12-09 格式:DOCX 页数:13 大小:351.17KB
下载 相关 举报
最速下降法和牛顿法求最小值点的算法及结果.docx_第1页
第1页 / 共13页
最速下降法和牛顿法求最小值点的算法及结果.docx_第2页
第2页 / 共13页
最速下降法和牛顿法求最小值点的算法及结果.docx_第3页
第3页 / 共13页
最速下降法和牛顿法求最小值点的算法及结果.docx_第4页
第4页 / 共13页
最速下降法和牛顿法求最小值点的算法及结果.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

最速下降法和牛顿法求最小值点的算法及结果.docx

《最速下降法和牛顿法求最小值点的算法及结果.docx》由会员分享,可在线阅读,更多相关《最速下降法和牛顿法求最小值点的算法及结果.docx(13页珍藏版)》请在冰豆网上搜索。

最速下降法和牛顿法求最小值点的算法及结果.docx

最速下降法和牛顿法求最小值点的算法及结果

 

最速下降法和牛顿法求最小值点的算法及结果(总11页)

1.最速下降法计算:

f=(x

-1)

+5(x

-5)

(1)程序代码如下:

#include<>

#include<>

doublef1(doublex,doubley)

{

doubler;

r=(pow(x-1,2)+5*pow((y-5),2));

returnr;

}

//最速下降法求最优解

voidmain()

{

doubleh=3,x0=3,x1,y0=6,y1,s,r0,r1;

doublee0=,e1=;

intk=0;

s=sqrt(pow(2*x0-2,2)+pow(10*y0-50,2));

printf("%dx1=%fx2=%fs=%f\n",k,x0,y0,s);

while(s>e1)

{

x1=x0;

y1=y0;

r0=f1(x0,y0);

h=3;

//一维搜索,成功失败法

while(fabs(h)>e0)

{

r1=f1((x1-h*2*(x1-1)),(y1-h*10*(y1-5)));

if(r1

{

x0=x1-h*2*(x1-1);

y0=y1-h*10*(y1-5);

r0=r1;

h=h+h;

}

elseif(fabs(h)>e0)

h=(-1)*h/4;

}

s=sqrt(pow(2*x0-2,2)+pow(10*y0-50,2));

k++;

printf("%dx1=%fx2=%fs=%f\n",k,x0,y0,s);

}

printf("x1=%fx2=%f",x0,y0);

}

(2)初始值设为x1=3,x2=6时,运行结果如下图1-1:

图1-1

(3)初始值设为x1=30000,x2=60000时,运行结果如下图1-2:

图1-2

2.牛顿法计算:

f=(x

-1)

+5(x

-5)

(1)程序代码如下:

#include<>

#include<>

doublef1(doublex,doubley)

{

return(pow(x-1,2)+5*pow(y-5,2));

}

//牛顿法求最优解

voidmain()

{

doubleh=3,x0=3,x1,y0=6,y1,s,r0,r1;

doublee0=,e1=;

intk=0;

s=sqrt(pow(2*x0-2,2)+pow(10*y0-50,2));

printf("%dx=%fy=%fs=%f\n",k,x0,y0,s);

while(s>e1)

{

x1=x0;

y1=y0;

r0=f1(x0,y0);

h=3;

//一维搜索

while(fabs(h)>e0)

{

r1=f1((x1-h*(x1-1)),(y1-h*(y1-5)));

if(r1

{

x0=x1-h*(x1-1);

y0=y1-h*(y1-5);

r0=r1;

h=h+h;

}

elseif(fabs(h)>e0)

h=(-1)*h/4;

}

s=sqrt(pow(2*x0-2,2)+pow(10*y0-50,2));

k++;

printf("%dx=%fy=%fs=%f\n",k,x0,y0,s);

}

printf("x=%fy=%f",x0,y0);

}

(2)初始值设为x1=3,x2=6时,运行结果如下图2-1:

图2-1

(3)初始值设为x1=30000,x2=60000时,运行结果如下图2-2:

图2-2

3.最速下降法求:

f=(x

-1)

+(x

-1)

+5(x

-5)

+5(x

-5)

(1)程序代码如下:

#include<>

#include<>

doublef1(doublex,doublex1,doubley,doubley1)

{

doubler;

r=(pow(x-1,2)+pow(x1-1,2)+5*pow(y-5,2)+5*pow(y1-5,2));

returnr;

}

//最速下降法求最优解

voidmain()

{

//x1,x2,x3,x4分别为多项式函数中四个分量的初始值

//x5,x6,x7,x8分别为对应的下一个值

doubled=3,x1=3,x5,x2=4,x6,x3=8,x7,x4=6,x8,s,r0,r1;

doublee0=,e1=;

intk=0;

s=sqrt(pow(2*x1-2,2)+pow(2*x2-2,2)+pow(10*x3-50,2)+pow(10*x4-50,2));

printf("%dx1=%fx2=%fx3=%fx4=%fs=%f\n",k,x1,x2,x3,x4,s);

while(s>e1)

{

x5=x1;

x6=x2;

x7=x3;

x8=x4;

r0=f1(x1,x2,x3,x4);

d=3;

//一维搜索

while(fabs(d)>e0)

{

r1=f1((x5-d*2*(x5-1)),(x6-d*2*(x6-1)),(x7-d*10*(x7-5)),(x8-d*10*(x8-5)));

if(r1

{

x1=x5-d*2*(x5-1);

x2=x6-d*2*(x6-1);

x3=x7-d*10*(x7-5);

x4=x8-d*10*(x8-5);

r0=r1;

d=d+d;

}

elseif(fabs(d)>e0)

d=(-1)*d/4;

}

s=sqrt(pow(2*x1-2,2)+pow(2*x2-2,2)+pow(10*x3-50,2)+pow(10*x4-50,2));

k++;

printf("%dx1=%fx2=%fx3=%fx4=%fs=%f\n",k,x1,x2,x3,x4,s);

}

printf("\nx1=%fx2=%fx3=%fx4=%fs=%f\n",x1,x2,x3,x4,s);

}

(2)初始值设为x1=3,x2=4,x3=8,x4=6时,运行结果如下图3-1:

图3-1

(3)初始值设为x1=30000,x2=40000,x3=80000,x4=60000时,运行结果如下图3-2:

图3-2

4.牛顿法计算:

f=(x

-1)

+(x

-1)

+5(x

-5)

+5(x

-5)

(1)程序代码如下:

#include<>

#include<>

doublef1(doublex,doublex1,doubley,doubley1)

{

doubler;

r=(pow(x-1,2)+pow(x1-1,2)+5*pow(y-5,2)+5*pow(y1-5,2));

returnr;

}

//最速下降法求最优解

voidmain()

{

//x1,x2,x3,x4分别为多项式函数中四个分量的当前值

//x5,x6,x7,x8分别为多项式函数中四个分量对应的下一个值

doubled=3,x1=3,x5,x2=4,x6,x3=8,x7,x4=6,x8,s,r0,r1;

doublee0=,e1=;

intk=0;

s=sqrt(pow(2*x1-2,2)+pow(2*x2-2,2)+pow(10*x3-50,2)+pow(10*x4-50,2));

printf("%dx1=%fx2=%fx3=%fx4=%fs=%f\n",k,x1,x2,x3,x4,s);

while(s>e1)

{

x5=x1;

x6=x2;

x7=x3;

x8=x4;

r0=f1(x1,x2,x3,x4);

d=3;

//一维搜索

while(fabs(d)>e0)

{

r1=f1((x5-d*(x5-1)),(x6-d*(x6-1)),(x7-d*(x7-5)),(x8-d*(x8-5)));

if(r1

{

x1=x5-d*(x5-1);

x2=x6-d*(x6-1);

x3=x7-d*(x7-5);

x4=x8-d*(x8-5);

r0=r1;

d=d+d;

}

elseif(fabs(d)>e0)

d=(-1)*d/4;

}

s=sqrt(pow(2*x1-2,2)+pow(2*x2-2,2)+pow(10*x3-50,2)+pow(10*x4-50,2));

k++;

printf("%dx1=%fx2=%fx3=%fx4=%fs=%f\n",k,x1,x2,x3,x4,s);

}

printf("\nx1=%fx2=%fx3=%fx4=%fs=%f\n",x1,x2,x3,x4,s);

}

(2)初始值设为x1=3,x2=4,x3=8,x4=6时,运行结果如下图4-1:

图4-1

(3)初始值设为x1=30000,x2=40000,x3=80000,x4=60000时,运行结果如下图4-2:

图4-2

5.总结

(1)每一种计算最优解的方法中,如果初始值不一样,那么得到最终结果所需的步骤数不一样;比较图1-1与图1-2,在图1-1中初始值为x1=3,x2=6,得到最终结果所需步骤数为23,而在图1-2中初始值为x1=30000,x2=60000,得到最终结果所需步骤数为39;同一算法中取值越偏离最优解,所需的计算步骤越多。

标题2、3、4下的每前两个图都说明了这一点。

(2)分别用最速下降法和牛顿法求同一多项式值,初始值都一样的情况下,牛顿法收敛速度较快;图1-2中用最速下降法计算,得到结果共计算了39步,经过一步迭代运算,x1从30000收敛到,再经过一步收敛到,图2-2中用牛顿法计算才用了20步,经过一步x1从30000收敛到了,再经过一步收敛到了。

(3)从图3-2和图4-2中可以看出最速下降法和牛顿法计算最小值,前面步骤收敛较快,每经过一步,x值的变化都比较大,后面步骤收敛慢,每经过一步,x值的变化比较小。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1