Matlab联立隐函数H(x,y1)和M(x,y2)求解新函数C(y1,y2)和因变量x的关系

目录

1. 问题描述

2. 函数图像

2.1 隐函数H的图像

2.2 隐函数M的图像

3. 解决思路

3.1 初步思路

3.2 实际情况

3.3 解决方法

4. 完整代码

5. 交流讨论


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 初步思路

  1. 对于隐函数H(x1,y1)的图像,可以得到一组一一对应的向量x1和y1,同理对于隐函数M(x2,y2),也可以得到一组一一对应的向量x2和y2;
  2. 如果这里的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的图像')

5. 交流讨论

猜你喜欢

转载自blog.csdn.net/qq_42276781/article/details/121193728