水平曲线为两个函数,用于求解非线性方程组



我想求解一个非线性方程组:

x^2 + y*sin(y) - 3 = 0 x*y +

exp(x) + y -5 = 0

所以我引入了两个函数 f1 = x^2 + y*sin(y) - 3 和 f2 = x*y + exp(x) + y -5。现在我正在尝试绘制水平曲线(在 0 处),以便我可以看到存在多少个解决方案。但我无法绘制有意义的结果(即找到交叉点)。

法典

x=linspace(-15,15,400);
y=linspace(-15,15,400);
f=@(x,y)(x.^2+y.*sin(y)-3);
[X,Y]=meshgrid(x,y);
Z=f(X,Y);
contour(X,Y,Z,10)
hold on
f=@(x,y)(x*y+exp(x)+y-5);
[X,Y]=meshgrid(x,y);
Z=f(X,Y);
contour(X,Y,Z,100)

我相信你做的事情有三个问题:

  1. 你忘记在公式中使用点积:f=@(x,y)(x*y+exp(x)+y-5),它应该是:f=@(x,y)(x.*y+exp(x)+y-5),因为你在矩阵X和Y上使用它。这已经为该函数提供了正确的结果。

  2. 您可以使用等值线绘制曲面的 2D 等值线图,这不是您希望用于查看 2D 函数零的轮廓图。 -> 改用surf

  3. 你在维度 x 中绘制x*y+exp(x)+y-5直到 15 的图,这已经在 1e6 的数量级......,所以当然,你再也看不到它穿过零的地方了......

试试这个代码:

x=linspace(-15,5,30);
y=linspace(-15,15,30);
f=@(x,y)(x.^2+y.*sin(y)-3);
[X,Y]=meshgrid(x,y);
Z=f(X,Y);
surf(X,Y,Z)
hold on
f=@(x,y)(x.*y+exp(x)+y-5);
Z=f(X,Y);
surf(X,Y,Z)

看到它们在哪里变为零并不是很清楚,但这是一个开始......

为什么不能直接使用solve函数?

syms x y
[sol_x, sol_y]=solve(x^2 + y*sin(y) - 3 == 0, x*y + exp(x) + y -5 == 0,x,y)

最新更新