You are on page 1of 7

最优化作业 1 郭洁榕

代码及说明:

//######################################################################
//中山大学航空航天学院
//最优化作业习题第二单元
//======================================================================
//姓名: 郭洁榕
//邮箱: guojr26@mail2.sysu.edu.cn
//日期: 2022 年 6 月 13 日
//######################################################################
#include <iostream>
#include<cmath>
using namespace std;

int num = 0;

//提示函数定义
void show()
{
cout << "请选择您要计算的题目:" << endl;
cout << "1:exp(-x) + x * x" << endl;
cout << "2:x * x - x - 1" << endl;
cout << "3:x * x * x - 2 * x + 1" << endl;
cout << "按 0 退出" << endl;
}

//f 函数定义
double f(double x)
{
if (num == 1)
{
return exp(-x) + x * x;
}
else if (num == 2)
{
return x * x - x - 1;
}
else if (num == 3)
{
return x * x * x - 2 * x + 1;
}

}
//golds 函数定义
double golds(double a, double b, double x1, double x2, double epsilon)
{
double y1 = f(x1);
double y2 = f(x2);

if (fabs(b - a) < epsilon)


{
return(y1 < y2) ? x1 : x2;
}
else if (y1 < y2)
{
return golds(a, x2, a + 0.312 * (x2 - a), a + 0.618 * (x2 - a), epsilon);
}
else if (y1 > y2)
{
return golds(x1, b, x1 + 0.312 * (b - x1), x1 + 0.618 * (b - x1), epsilon);
}
else
{
return golds(x1, x2, x1 + 0.312 * (x2 - x1), x1 + 0.618 * (x2 - x1), epsilon);
}

//主函数
int main()
{
while (true)
{
show();
cin >> num;
//输入参数
double a, b, epsilon;
cout << "请输入端点 a:" << endl;
cin >> a;
cout << "请输入端点 b:" << endl;
cin >> b;
cout << "请输入精度 epsilon:" << endl;
cin >> epsilon;

double x1 = 0.312 * (b - a);


double x2 = 0.618 * (b - a);
double x = golds(a, b, x1, x2, epsilon);
double y = f(x);
cout << "在 x=" << x << "时取得最小值,此时 y=" << y << endl;
}
system("pause");
return 0;

}
数值实验结果:

由数值实验结果可知
1:e-x+ x2
在[0.1]区间,精度 epsilon=0.01(<0.2)时的最小值在 x=0.351153 取得,此时 y=0.827184

2:x 2 - x – 1
在[0.1]区间,精度 epsilon=0.05 时的最小值在 x=0.502219 取得,此时 y=-1.25

3:x 3 - 2 x + 1
在[0.3]区间,精度 epsilon=0.15 时的最小值在 x=0.810537 时取得最小值,此时 y=-0.0885753
准确度验证

将函数在 matlab 中绘制,并标注最小值点;

得到函数图形及最小值如下图所示:
图 习题 2.1

图 习题 2.2
图 习题 2.3

可知,习题 1,2 的黄金分割法的计算结果与 matlab 计算结果较为接近,可信度较高。


习题 3 的误差较大,在将 matlab 的计算步长由 0.15 调整为 0.01 之后,计算结果与黄金分割
法更接近,可见黄金分割法在计算较简单函数时有比较高的可信度。

You might also like