对分法求解目标函数最优解函数MATLAB实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

%%对分法求解目标函数最优解函数function[t,y]=equation_extremum(x,~,a,b,epsional)%%=======================================%函数默认参数:%x为目标函数,输入字符串型,默认最优解求其最小值%a,b为其初始区间,默认闭区间,ab%对初始区间的要求:初始区间是单谷区间,函数求极小值%则a处的导数=0,b处的导数=0;%%=======================================symst;x_inline=inline(sym(x));func_diff=diff(sym(x));func_diff_inline=inline(func_diff);t=b;high_value=func_diff_inline(t);t=a;low_value=func_diff_inline(t);ifhigh_value*low_value0t='本函数不可解';y='给定初始区间非单谷区间';elseifhigh_value*low_value==0ifhigh_value==0t=b;y=x_inline(t);elset=a;y=x_inline(t);endelsewhileabs(high_value-low_value)=epsional;c=1/2*(b+a);t=c;middle_value=func_diff_inline(t);ifmiddle_value0high_value=middle_value;b=c;elseifmiddle_value0low_value=middle_value;a=c;elseifmiddle_value==0break;endendendendc=1/2*(b+a);t=c;y=x_inline(t);endend运行代码:%%========================closeall;clearall;clc;%%目标函数symst;[t,y]=equation_extremum('t*(t-3)',t,-3,5,0.1);disp([t,y]);运行结果:t=1.5y=-2.25%%抛物线法求函数最优解function[t,y]=parabola_extremum(x,~,t1,t2,epsional)%%=======================================%函数默认参数:%x为目标函数,输入字符串型,例如:'x^2-sin(x)'默认最优解求其最小值%a,b为其初始区间,默认闭区间,t1t2%对初始区间的要求:初始区间是单谷区间,函数求极小值%%=======================================symst;x_inline=inline(sym(x));%%生成随机数求出t0;high_value=x_inline(t2);low_value=x_inline(t1);t0=parabola_overture(x,t,t1,t2);%自定义函数,试探法求t0middle_value=x_inline(t0);%%拟合曲线,待定系数法%p(t0)=a0+a1*t0+a2*t0^2=f(t0)%p(t1)=a0+a1*t1+a2*t2^2=f(t1)%p(t2)=a0+a1*t2+a2*t2^2=f(t2)%推出:%a1=((t0^2-t2^2)*f(t1)+(t2^2-t1^2)*f(t0)+(t1^2-t0^2)*f(t2))/((t1-t0)*(t0-t2)*(t2-t1))%a2=((t0-t2)*f(t1)+(t2-t1)*f(t0)+(t1-t0)*f(t2))/((t1-t0)*(t0-t2)*(t2-t1))while1t_ba=0.5*((t0^2-t2^2)*low_value+(t2^2-t1^2)*middle_value+(t1^2-t0^2)*high_value)/((t0-t2)*low_value+(t2-t1)*middle_value+(t1-t0)*high_value);t_ba_value=x_inline(t_ba);ifabs(t_ba-t0)epsionalt=t_ba;y=t_ba_value;break;elseift_bat0ift_ba_value=middle_valuet1=t0;t0=t_ba;low_value=middle_value;middle_value=t_ba_value;elset2=t_ba;high_value=t_ba_value;endelseift_ba_value=middle_valuet2=t0;t0=t_ba;high_value=middle_value;middle_value=t_ba_value;elset1=t_ba;low_value=t_ba_value;endendenddisp([t1,t0,t2;low_value,middle_value,high_value])end%%试探法求函数低点值,用于抛物线插值法functiont0=parabola_overture(x,~,a,b)%%=======================================%函数默认参数:%x为目标函数,输入字符串型,例如:'x^2-sin(x)'%a,b为其初始区间,默认闭区间,ab%对初始区间的要求:初始区间是单谷区间,函数求极小值%%=======================================symst;x_inline=inline(sym(x));%%生成随机数求出t0;rand_t0=rand(1,10);high_value=x_inline(b);low_value=x_inline(a);middle_value=x_inline(rand_t0(1));k=1;whilemiddle_valuehigh_value||middle_valuelow_valuek=k+1;middle_value=x_inline(rand_t0(k));ifk50printf('请重新运行程序');break;endendt0=rand_t0(k);运行代码:closeall;clearall;clc;symst;x='t^2-sin(t)';x_inline=inline(sym(x));[t,y]=parabola_extremum(x,t,0,1,1e-4)运行结果:t=0.450178858985791y=-0.232465575130718

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功