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

跪求大神帮助。我不会用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取最大值
看清我的问题

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

 

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

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-06

  你的意思是根据隐函数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这个的

关于matlab的一个问题,怎样得到一个隐性函数的优化解?
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;%...

怎么用MATLAB求解隐性函数方程
ans = 2*atan(39\/112 - ((7439*(9*((13*2^(1\/2)*3^(1\/2)*649357^(1\/2))\/10976 + 175451\/84672)^(2\/3) - (27975*((13*2^(1\/2)*3^(1\/2)*649357^(1\/2))\/10976 + 175451\/84672)^(1\/3))\/3136 - 7439\/784)^(1\/2))\/784 - 9*((13*2^(1\/2)*3^(1\/2)*...

关于用MATLAB求解隐函数的问题
用subs函数可以将solve接出来的解析解里面的变量用数字替换掉,然后得到数值解。给你举个简单的例子,求a*x=b的解,先求解析解,然后用a=2,b=1代入求出数值解:>> solution=solve('a*x=b', 'x')solution = b\/a >> num_solution = subs(solution, '[a,b]', [2 1])num_solution =...

目标函数有两个未知变量,怎么用matlab求最优解?
x = 35.6887 195.5207其中第一个值为p,第二个为Q。目标函数为:>> z(x)ans = 2.9446e+003需要注意的是初值的选择需要慎重,选择不当很容易落在局部最优点(0,0)处。优化结果绘制二维图如下:h=ezmesh(@(p,Q)arrayfun(@(x1,x2)z([x1,x2]),p,Q),[0 50 0 300]);set(...

求解关于matlab求解隐函数非线性方程组,并绘制曲线的问题,求具体代码...
用matlab是可以解的。不过你现在的问题好像没有说清楚。前面两个方程跟后面似乎完全无关。我先把它解出来吧:>> syms x y t >> eq1='5+10*cos(5*t)-x*cos(y)=0'>> eq2='10*sin(5*t)-x*sin(y)=0'>> [x y]=solve(eq1,eq2)x = 5*(5+4*cos(5*t))^(1\/2)-5*(5+...

matlab求解优化问题,如果没有目标函数,只有约束条件,可否随机生成一
问题的关键就是多目标的问题 fmincon是只能寻找一个目标的,也就是目标函数只有一个返回值 如果要多目标优化,那么需要使用遗传算法或其它办法 但是多目标优化本来就是一个可能不能完全实现所有目标的优化结果 也就是说多个目标很多时候是无法同时达到的,和多时候只能得到离多个目标都比较近的结果 所以,...

一个简单的matlab问题,fmincon优化,谢谢
因为 f 是一个凸函数,函数的极小值发生在 f 对 x(1) 和 x(2) 的偏导为 0 的地方,或者在约束条件的边界上。本题的主函数的点为 x(1)=2, x(2)=3, 在约束条件以外,所以,最小值发生在离这个点最近的约束条件边界上,即 x(1)=3, x(2)=4,其对应的最小值为 28。用Matlab的...

求解一个matlab问题
最直接的方法就是,把这个fruits转成cellstr后,length得到每一个单词的长度,然后min就知道最短的长度,然后find找到那个最短的单词。或者把fruits当做一个整体,size(fruits,2)得到它的列数。然后从左到右顺序遍历每一列,strfind找' '空字符,最先找到空字符的那一列就是最短的单词。不过感觉这...

关于MATLAB solve的一个问题
函数默认的都把变量当作sym来运算 计算出来的结果都是sym对象。为什么呢?追去更高的准确度。譬如solve('x=32\/3')计算出来的是32\/3 而不是小数 sym对象计算出来的是一个表达式,而不是数值。如果您想要得到数值结果的话,再用一个函数eval即可 [x1,y1]=solve('(x-NodeE(1,1))^2+(y-NodeE...

用Matlab编程求如下一个隐函数方程(用fsolve或者别的什么函数),其中q=...
化简后 这个方程只有唯一的解0,一眼能看出来,只有一个未知数,干嘛要求什么隐函数?

相似回答