首页 > 编程知识 正文

matlab求函数在区间最大值,matlab求分段函数的值

时间:2023-05-06 03:17:13 阅读:137045 作者:1804

MATLAB最速下降法求函数极小值1 .题目2.matlab码2.1主函数2.2调用函数2.3执行结果3 .分析

前言:用最速下降法求解函数极小值的理论部分已经在前一篇文章中写了。 这篇文章直接解决具体问题,并附上matlab代码。

1 .主题

设初始点为[x1 x2]=[-2.5 4.5]、0.01,求出目标函数极小值。

2.matlab代码2.1主函数syms x1 x2 s; %声明符号变量f1=x1 ^4-2* x1 ^2* x2-2 * x1 * x2 x1 ^2* x2 ^ 24.5 * x1-4 * x2; 设置%目标函数k=steepest_descent(f1,x1,x2,s,[-2.5,4.25 ],10^(-2 ) ); %起始点[ x1x2]=[-2.5,4.25 ]和精度10^(-2 ) result_string=sprintf ) (重复%d次后求出极小值(n (,k ); %重复多少次后求出极小值disp(result_string ); 2.2调用函数functionk=steepest_descent(f,x1,x2,s,start_point,thereshold ) k=0; %迭代次数赋值初始化grad_f=[diff(f(f,x1 ) diff ) f,x2 ) ]; %计算f的梯度delta=subs(grad_f,[x1,x2],[start_point(2(1),start_point )2) ); %计算起点的坡度step=1; %将初始步骤设置为1 current_point=start_point; %起点值被提供给当前点%最速下降法的主循环,判定条件是坡度的大小和给定的精度值的比较whilenorm(Delta ) thereshold k=k 1; 确定%迭代次数1 %的一维搜索最优步长(在此情形中,方向已知,且步骤s为变量)x_next=[current_point(2(1]),current_point )2)-s * dedes 计算%x(k1)点。 其中步骤s是变量f_val=subs(f,[x1,x2],[x_next(2(1),x_next )2) ); 将%x值带入目标函数的step=ABS(double(solve ) diff(f_val,s ) ) %s求一次微分,标注绝对值的符号,求出最佳步骤的绝对值step=step(1) %更新步骤%计算x(k1 )点current _ point (2=double ([ current _ point )1],current _ point2)-step*Delta/norm ) %计算函数值f_value=double(subs(f,[x1,x2],[current_point(2(1)1],current_point) ) ) ); %迭代计算过程result_string=sprintf(k=%d,x1=%.6f,x2=%.6f ) x1,x2 )=%.6f ', k,curr endend (使用代码时,将主函数中的目标函数作为起点; 精度,重新设定为需要的东西就可以执行。 )

2.3运行结果

3 .分析将收敛条件由0.01改为10^((-6 ),运行结果如下:

用最速下降法求函数极小值时,在最初几个步骤的反复中函数值的下降很快,但函数值为越接近理论极小值时,函数值下降的越慢,同时越接近理论极小值步长也越小,所以最速下降法的收敛速度不快是因为函数

负梯度方向为其最速下降方向仅仅是针对该点处而言

最速下降法的优点:对初始点的选择要求低,远离极值点收敛速度快

缺点:越接近理论极小值,收敛速度越慢

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。