关于matlab的一个问题,怎样得到一个隐性函数的优化解? 100

跪求大神帮助。我不会用matlab。但想要优化一个模型。如一个关于x,y的算术式子=一个常数,然后我要求当x取什么值,y取最大值例如1000y/(x^2+y^2+600)... 跪求大神帮助。我不会用matlab。但想要优化一个模型。
如 一个关于x,y的算术式子=一个常数,然后我要求当x取什么值,y取最大值
例如 1000y/(x^2+y^2+600)^1.5+1000y/(1.25x^2+2.25y^2+600)^1.5=20 (不知道有没有解,有没有图,但类似这样的式子就可以)
我想要编程的格式 不是结果
我要求的是当x取什么值,y取最大值
看清我的问题
展开
 我来答
tianxiawulang
2013-08-07 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2608万
展开全部

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作为优化的初始点比较重要,如果选择不当,可能得不到希望的结果。

 

希望对楼主有帮助,如有问题请追问。

WM_THU
2013-08-06 · TA获得超过7164个赞
知道大有可为答主
回答量:4285
采纳率:80%
帮助的人:3901万
展开全部

  你的意思是根据隐函数f(x,y)=0求y的最大值。我这有一个思路:

  1. 把y视作x的函数,然后将隐函数两边对x求导。令dy/dx=0,得到一个关于x的方程。

  2. 用matlab的solve函数求解这个方程,得到y的极大值点。

  3. 从中再穷举找出y的最大值点。因为是实际问题,所以不必担心最大值点在边界或者函数无界的情形。

  

追问
有没有matlab程序语言啊
帮我编一下,我不会啊 就编1000y/(x^2+y^2+600)^1.5+1000y/(1.25x^2+2.25y^2+600)^1.5=20这个的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式