关于matlab的一个问题,怎样得到一个隐性函数的优化解?
发布网友
发布时间:2023-07-09 17:49
我来回答
共2个回答
热心网友
时间:2024-08-18 17:59
1、你给的这个方程是没有实数解的,这可以很简单的从下图看出:
上图是把方程左端对应的曲面,使用下面的一条语句即可绘制:
ezmesh('1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5',[-100 100])
从图可见,方程左端的取值范围最大只比1稍多一点,不可能等于20,所以方程无解。
假如方程有解,比如说,这个例子中我们把方程右端的20换成0.5,那么可以用下面的程序求解(代码文件已作为附件上传):
function zd
c0 = 0.5;
xy0 = [0 100];
opt = optimset('Display', 'iter');
% 图1:在等高线图上标出最大值点
figure(1)
clf
hold on
h = ezcontour('1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5',[-50 50]);
set(h, 'linestyle', ':')
h = ezplot(['1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5-' num2str(c0)], [-50 50]);
set(h, 'linew', 2)
h = plot(xy0(1), xy0(2), 'ro', 'markerfacecolor', 'r');
% 优化
xy = fmincon(@obj,xy0,[],[],[],[],[],[],@nonlcon,opt,c0, h);
% 图2:在曲面上标出最大值点
figure(2)
clf
hold on
h = ezmesh('1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5',[-100 100]);
set(h, 'EdgeAlpha', 0.2, 'FaceAlpha', 0.2);
x = get(h, 'xData');
y = get(h, 'yData');
z = get(h, 'zData');max(z)
plot3(xy(1), xy(2), c0, 'ro', 'markerfacecolor', 'r');
v = [-c0 c0];
[C, h] = contour3(x, y, z, v);
clabel(C, h, v)
view(100,35)
function f = obj(x, c0, h)
% 目标函数尽管不需要使用附加参数c0、h,但必须能够接受此参数
f = -x(2);
function [c,ceq] = nonlcon(x, c0, h)
c = [];
y = x(2);
x = x(1);
ceq = 1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5 - c0;
% 更新绘图
set(h, 'x', x, 'y', y);
drawnow
pause(0.1)
其实程序中大多数代码与绘图有关,以便于比较形象的把结果表现出来,如下面两个图所示:
如果对绘图不感兴趣,只需要下面的几行代码:
function zd
c0 = 0.5;
xy0 = [0 100];
xy = fmincon(@obj,xy0,[],[],[],[],[],[],@nonlcon)
function f = obj(x)
f = -x(2);
function [c,ceq] = nonlcon(x)
c = [];
y = x(2);
x = x(1);
ceq = 1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5 - 0.5;
需要提醒注意的是,xy0作为优化的初始点比较重要,如果选择不当,可能得不到希望的结果。
希望对楼主有帮助,如有问题请追问。
热心网友
时间:2024-08-18 17:59
你的意思是根据隐函数f(x,y)=0求y的最大值。我这有一个思路:
把y视作x的函数,然后将隐函数两边对x求导。令dy/dx=0,得到一个关于x的方程。
用matlab的solve函数求解这个方程,得到y的极大值点。
从中再穷举找出y的最大值点。因为是实际问题,所以不必担心最大值点在边界或者函数无界的情形。
追问有没有matlab程序语言啊
帮我编一下,我不会啊 就编1000y/(x^2+y^2+600)^1.5+1000y/(1.25x^2+2.25y^2+600)^1.5=20这个的
热心网友
时间:2024-08-18 17:59
1、你给的这个方程是没有实数解的,这可以很简单的从下图看出:
上图是把方程左端对应的曲面,使用下面的一条语句即可绘制:
ezmesh('1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5',[-100 100])
从图可见,方程左端的取值范围最大只比1稍多一点,不可能等于20,所以方程无解。
假如方程有解,比如说,这个例子中我们把方程右端的20换成0.5,那么可以用下面的程序求解(代码文件已作为附件上传):
function zd
c0 = 0.5;
xy0 = [0 100];
opt = optimset('Display', 'iter');
% 图1:在等高线图上标出最大值点
figure(1)
clf
hold on
h = ezcontour('1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5',[-50 50]);
set(h, 'linestyle', ':')
h = ezplot(['1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5-' num2str(c0)], [-50 50]);
set(h, 'linew', 2)
h = plot(xy0(1), xy0(2), 'ro', 'markerfacecolor', 'r');
% 优化
xy = fmincon(@obj,xy0,[],[],[],[],[],[],@nonlcon,opt,c0, h);
% 图2:在曲面上标出最大值点
figure(2)
clf
hold on
h = ezmesh('1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5',[-100 100]);
set(h, 'EdgeAlpha', 0.2, 'FaceAlpha', 0.2);
x = get(h, 'xData');
y = get(h, 'yData');
z = get(h, 'zData');max(z)
plot3(xy(1), xy(2), c0, 'ro', 'markerfacecolor', 'r');
v = [-c0 c0];
[C, h] = contour3(x, y, z, v);
clabel(C, h, v)
view(100,35)
function f = obj(x, c0, h)
% 目标函数尽管不需要使用附加参数c0、h,但必须能够接受此参数
f = -x(2);
function [c,ceq] = nonlcon(x, c0, h)
c = [];
y = x(2);
x = x(1);
ceq = 1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5 - c0;
% 更新绘图
set(h, 'x', x, 'y', y);
drawnow
pause(0.1)
其实程序中大多数代码与绘图有关,以便于比较形象的把结果表现出来,如下面两个图所示:
如果对绘图不感兴趣,只需要下面的几行代码:
function zd
c0 = 0.5;
xy0 = [0 100];
xy = fmincon(@obj,xy0,[],[],[],[],[],[],@nonlcon)
function f = obj(x)
f = -x(2);
function [c,ceq] = nonlcon(x)
c = [];
y = x(2);
x = x(1);
ceq = 1000*y/(x^2+y^2+600)^1.5+1000*y/(1.25*x^2+2.25*y^2+600)^1.5 - 0.5;
需要提醒注意的是,xy0作为优化的初始点比较重要,如果选择不当,可能得不到希望的结果。
希望对楼主有帮助,如有问题请追问。
热心网友
时间:2024-08-18 17:59
你的意思是根据隐函数f(x,y)=0求y的最大值。我这有一个思路:
把y视作x的函数,然后将隐函数两边对x求导。令dy/dx=0,得到一个关于x的方程。
用matlab的solve函数求解这个方程,得到y的极大值点。
从中再穷举找出y的最大值点。因为是实际问题,所以不必担心最大值点在边界或者函数无界的情形。
追问有没有matlab程序语言啊
帮我编一下,我不会啊 就编1000y/(x^2+y^2+600)^1.5+1000y/(1.25x^2+2.25y^2+600)^1.5=20这个的