目录
1. 问题描述
已知条件如下:
①隐函数H(x,y1) = exp(2*x-y1)*log(x-3*y1)-4 = 0
②隐函数M(x,y2) = log(2*x-y2)/exp(x-2*y2)+3 = 0
现有函数y = C(y1,y2) = exp(1-y1*y2),求y和x在坐标轴范围x∈[2,10],y∈[0,25]的函数图像
2. 函数图像
我们借助matlab的官方函数fimplicit绘制隐函数H和M的图像。
fimplicit函数接收两个参数,一个是匿名函数,一个是坐标轴范围。
2.1 隐函数H的图像
figure
H = @(x,y) exp(2*x-y)*log(x-3*y)-4;
bound = [2,10,0,25];
h = fimplicit(H, bound);
title('隐函数H')
2.2 隐函数M的图像
%% 绘制隐函数M
figure
M = @(x,y) log(2*x-y)/exp(x-2*y)+3;
bound = [2,10,0,25];
m = fimplicit(M, bound);
title('隐函数M')
3. 解决思路
3.1 初步思路
- 对于隐函数H(x1,y1)的图像,可以得到一组一一对应的向量x1和y1,同理对于隐函数M(x2,y2),也可以得到一组一一对应的向量x2和y2;
- 如果这里的x1和x2完美契合,即x1向量和x2向量完全一致,不妨用x来表示x1和x2,那么只需要将y1向量和y2向量代入函数表达式y = C(y1,y2) = exp(1-y1*y2),计算得到y向量,利用plot(x, y)就可以得到目标函数图像。
3.2 实际情况
对于隐函数H,函数fimplicit不光绘制隐函数H在bound上的图像,还会返回该图像窗口,这里用h接收其返回的图像窗口
h = fimplicit(H, bound);
在工作区内查看该h变量,可以发现其有子属性XData和YData,分别对应图像上各点的横纵坐标。
于是,利用fimplicit的返回值,可以得到隐函数H和M图像的x、y向量
%% 获取隐函数H的x1、y1向量
x1 = h.XData;
y1 = h.YData;
%% 获取隐函数M的x2、y2向量
x2 = m.XData;
y2 = m.YData;
遗憾的是,x1和x2并没有完全一致(完全一致的要求是x1和x2的长度首先需要一样,其次两个向量相减为0向量)。
3.3 解决方法
对于这种情况,我们可以考虑对H的图像进行插值,人为地选取向量x = [x1, x2, ..., xn],并得到与其对应的yp1;同理,同样使用向量x = [x1, x2, ..., xn]对M的图像进行插值,得到与其对应的yp2,这样就建立了x与yp1、x与yp2的映射关系。
%% 设置x的插值点,对y1和y2进行插值
x = 2:0.5:10; %设置x的插值点
yp1 = interp1(x1, y1, x); %用x对y1重新插值得到yp1
yp2 = interp1(x2, y2, x); %用x对y2重新插值得到yp2
进一步地,通过y = C(y1,y2) = exp(1-y1*y2),可以得到x与y的映射关系,从而绘制目标图像。
%% 计算及绘图
y = exp(1-yp1.*yp2);
figure
plot(x, y), title('x和y的图像')
4. 完整代码
clear, close all
%% 绘制隐函数H
figure
H = @(x,y) exp(2*x-y)*log(x-3*y)-4;
bound = [2,10,0,25];
h = fimplicit(H, bound);
title('隐函数H')
%% 绘制隐函数M
figure
M = @(x,y) log(2*x-y)/exp(x-2*y)+3;
bound = [2,10,0,25];
m = fimplicit(M, bound);
title('隐函数M')
%% 获取隐函数H的x1、y1向量
x1 = h.XData;
y1 = h.YData;
%% 获取隐函数M的x2、y2向量
x2 = m.XData;
y2 = m.YData;
%% 设置x的插值点,对y1和y2进行插值
x = 2:0.5:10; %设置x的插值点
yp1 = interp1(x1, y1, x); %用x对y1重新插值得到yp1
yp2 = interp1(x2, y2, x); %用x对y2重新插值得到yp2
%% 计算及绘图
y = exp(1-yp1.*yp2);
figure
plot(x, y), title('x和y的图像')