MATLAB的牛顿法求多元函数的极值程序加实例
今天主要是讲解MATLAB的牛顿法求多元函数的极值程序加实例。
实例1
求f(x,y)= sin(x^2+y^2)*exp(-0.1*(x^2+y^2+x*y+2*x)),在-2<=x<=2,-2<=y<=2上的极值点和极值。
主程序 clc; clear all; close all; syms x y;%定义函数变量 x y f = sin(x^2+y^2)*exp(-0.1*(x^2+y^2+x*y+2*x)); x0 = [1 1];%初始点 x0(1,1) [x_best,f_best] = Newton(f,x0,[x y]); x_best f_best = vpa(f_best) x = -2:0.01:2; y = x; [X,Y] = meshgrid(x,y); F = sin(X.^2+Y.^2)*exp(-0.1*(X.^2+Y.^2+X.*Y+2.*X)); figure; mesh(X,Y,F); xlabel("x"); ylabel("y"); zlabel("z");
牛顿法函数 function [x_best,f_best] = Newton(f,x0,x,epsilon) %% 牛顿法求解函数的最小值(极小值) %% 输入 % f:目标函数 % x0:初始点 % x:自变量向量 % epsilon:精度 %% 输出 % x_bes:目标函数取最小值时的自变量值 % f_best:目标函数的最小值 format long;%改变数据显示格式 if nargin == 3 %默认的精度 epsilon = 1.0e-6; end x0 = transpose(x0);%transpose函数的功能是转置向量或矩阵 x = transpose(x);%transpose函数的功能是转置向量或矩阵 g1f = jacobian(f,x);% jacobian求解向量函数的雅可比矩阵式 g2f = jacobian(g1f,x);% jacobian求解向量函数的雅可比矩阵式 % 参数初始化 grad_fxk = 1; k = 0; xk = x0; while norm(grad_fxk) > epsilon % 计算矩阵 (向量) X的2-范数 grad_fxk = subs(g1f,x,xk);% 计算矩阵 (向量) 雅可比矩阵式在xk处的值 grad2_fxk = subs(g2f,x,xk); pk = -inv(grad2_fxk)*transpose(grad_fxk); % 步长 pk = double(pk);%转化为双精度浮点类型 xk_next = xk + pk; % xk = xk_next; k = k + 1; f_1 = subs(f,x,xk);%计算函数值 %输出迭代结果 fprintf("迭代次数:%d 误差:%.20f 极值点:(x,y) = (%f,%f) 极值:f(x,y) = %.20f ",k,vpa(norm(grad_fxk)),xk(1),xk(2),vpa(f_1)); end %输出极值点和极值 x_best = xk_next; f_best = subs(f,x,x_best); end
运行结果 迭代次数:1 误差:1.02885710610701086587 极值点:(x,y) = (0.669084,0.966374) 极值:f(x,y) = 0.70142228466448164337 迭代次数:2 误差:0.14448082736806977522 极值点:(x,y) = (1.195944,0.595077) 极值:f(x,y) = 0.59942448686119498280 迭代次数:3 误差:0.67873695620313101440 极值点:(x,y) = (1.032695,0.554239) 极值:f(x,y) = 0.65658602325338621952 迭代次数:4 误差:0.03278835230868389766 极值点:(x,y) = (1.077563,0.457762) 极值:f(x,y) = 0.65569150404015985600 迭代次数:5 误差:0.01819636638003245543 极值点:(x,y) = (1.069052,0.464828) 极值:f(x,y) = 0.65572832791085189363 迭代次数:6 误差:0.00027874333536557117 极值点:(x,y) = (1.069330,0.464057) 极值:f(x,y) = 0.65572826847418552720 迭代次数:7 误差:0.00000108627104183494 极值点:(x,y) = (1.069329,0.464058) 极值:f(x,y) = 0.65572826847430654151 迭代次数:8 误差:0.00000000000108544724 极值点:(x,y) = (1.069329,0.464058) 极值:f(x,y) = 0.65572826847430654151 x_best = 1.069329230413560 0.464057718471801 f_best = 0.65572826847430659287489727298377
实例2
求f(x,y)= 4*(x-y)-x^2-y^2,在-2<=x<=2,-2<=y<=2上的极值点和极值。
主程序 clc; clear all; close all; syms x y;%定义函数变量 x y fx = 4*(x-y)-x^2-y^2;%定义二元变量函数 x0 = [1 1];%初始点 x0(1,1) [x_best,f_best] = Newton(fx,x0,[x y]); x_best f_best = vpa(f_best) x = -2:0.1:2; y = x; [X,Y] = meshgrid(x,y); F = 4.*(X-Y)-X.^2-Y.^2; figure; mesh(X,Y,F); xlabel("x"); ylabel("y"); zlabel("z");
运行结果 迭代次数:1 误差:6.32455532033675904557 极值点:(x,y) = (2.000000,-2.000000) 极值:f(x,y) = 8.00000000000000000000 迭代次数:2 误差:0.00000000000000000000 极值点:(x,y) = (2.000000,-2.000000) 极值:f(x,y) = 8.00000000000000000000 x_best = 2 -2 f_best = 8.0
实例3
求f(x,y)= (1-x)^2+100*(y-x^2)^2,在-2<=x<=2,-2<=y<=2上的极值点和极值。
主程序 clc; clear all; close all; syms x y;%定义函数变量 x y f = (1-x)^2+100*(y-x^2)^2; x0 = [0 0];%初始点 x0(1,1) [x_best,f_best] = Newton(f,x0,[x y]); x_best f_best = vpa(f_best) x = -2:0.1:2; y = x; [X,Y] = meshgrid(x,y); F = (1-X).^2+100.*(Y-X.^2).^2; figure; mesh(X,Y,F); xlabel("x"); ylabel("y"); zlabel("z");
运行结果 迭代次数:1 误差:2.00000000000000000000 极值点:(x,y) = (1.000000,0.000000) 极值:f(x,y) = 100.00000000000000000000 迭代次数:2 误差:447.21359549995793258859 极值点:(x,y) = (1.000000,1.000000) 极值:f(x,y) = 0.00000000000000000000 迭代次数:3 误差:0.00000000000000000000 极值点:(x,y) = (1.000000,1.000000) 极值:f(x,y) = 0.00000000000000000000 x_best = 1 1 f_best = 0.0
实例4
主程序 clc; clear all; close all; syms x; f = 9.*x.^2-sin(x)-1; [x_optimization,y] = Newton_Method(f,2); x_optimization = double(x_optimization); y =vpa(y) x_optimization x = -10:0.01:10; ft = 9.*x.^2-sin(x)-1; figure(1) plot(x,ft); hold on; plot(x_optimization,y,"r*");
Newton_Method函数程序 function [x_optimization,f_optimization] = Newton_Method(f,x0) format long; % f:目标函数 % x0:初始点 % epsilon:精度 % x_optimization:目标函数取最小值时的自变量值 % f_optimization:目标函数的最小值 if nargin == 2 epsilon = 1.0e-6; end df = diff(f); % 一阶导数 d2f = diff(df); % 二阶导数 k = 0; dfxk = 1; xk = x0; while dfxk > epsilon dfx = subs(df,symvar(df),xk); if diff(d2f) == 0 d2fx = double(d2f); % 二阶导数不能为零 else d2fx = subs(d2f,symvar(d2f),xk); end xk_next = xk - dfx/d2fx; k = k + 1; dfxk = abs(dfx); xk = xk_next; % 迭代 end x_optimization = xk_next; f_optimization = subs(f,symvar(f),x_optimization); format short; end
运行结果 y = -1.0277492701423876507411151284973 x_optimization = 0.0555
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙
勇士参与三方交易讨论,交易报价骑士中锋阿伦据美媒报道的消息,勇士骑士步行者三支球队一笔三方6人的交易方案,如果谈判顺利,怀斯曼将加盟步行者,贾莱特阿伦将辅佐库里,骑士得到特纳。具体交易方案为勇士送出怀斯曼库明加罗林斯202
太黑暗了,心理素质不好真不建议看世界杯正在火热进行中,相信提到梅西,大家多少不会陌生。今年,梅西所在的阿根廷队,依旧拥有众多狂热支持他们的球迷。资深球迷或许记得,1986年世界杯上,阿根廷队夺冠的名场面。但就在前
EKLoopFPT120140散热风扇发布针对冷排散热器优化,引入菊花链连接来自斯洛文尼亚的著名PC水冷散热制造厂商EKWB宣布,推出其迄今为止最先进的风扇产品EKLoopFPT120140。这些高风压散热风扇将在产品线中完全取代现有的Vardar系列,针
进行PLC选型你该有自己的判断有个词语叫做人云亦云,就是别人说什么你就没脑子的跟着说什么,具体说的对不对,不知道。在现实生活中,我们购买商品很多时候也是这样,从众心理作祟,大家买什么我就买什么,也不管是不是适合
张国全小米10Pro系列将支持升级MIUI14IT之家12月5日消息,此前小米宣布将举行小米13系列MIUI14新品发布会,届时,小米13小米13Pro全新MIUI14系统将正式亮相。小米官方预热MIUI14,称该系统将展开剃
高龄孕育难难难!如何备孕更高效?说女人老了是一种非常不友好的说法,但在生殖中心,如果你的年龄35,想要成功孕育,医生通常会在病历上写下高龄!随着国家三胎政策的放开高龄孕妇已不再是少数现象尤其是超过40甚至45岁的
我的信仰信仰,是一种精神的体现,是一种思想和意志的表现。当个人信仰融入到一个代表共同信仰的团体时,表明了这个团体成员一定是一群志同道合志趣相同的人,因此信仰就产生凝聚力。信仰,可以产生力量
潮评九届戏剧节,给乌镇带来什么?10天之间,戏剧节轻施魔法,将整个小镇笼罩在了如梦似幻的乐曲中。古镇处处奔涌着充满热力的戏剧浪潮22部特邀剧目惊艳上演,18组青年竞演各展锋芒,上千场的嘉年华表演掀起没有围墙的狂欢
受害者喊话催收要自证身份,欢迎来电提供近些年来,5000家P2P平台跑路的跑路失联的失联立案的立案,但有一些网贷平台至今仍在逍遥法外,因为他们变更了公司主体的名字,变更了经营范围,还有的P2P平台干脆把P2P平台运营公
请为您心目中的河北大工匠点赞本报讯(记者高会坡通讯员刘子峣)12月5日,记者从省总工会获悉,2023年河北大工匠年度人物寻访宣传活动自即日起进入网络宣传点赞阶段,全省广大职工可关注冀工之家订阅号微信公众平台,
大盘没有风险本周开盘首个交易日,三大股指直接跳空高开,唯有创业板指震荡收跌,全天走势完全符股评家预判。虽然沪深股指直接走出中阳行情,但金融板块及中字头个股全面大涨,带动大盘强势站稳3200点,