我想求解一个非线性方程组:
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)
我相信你做的事情有三个问题:
-
你忘记在公式中使用点积:
f=@(x,y)(x*y+exp(x)+y-5)
,它应该是:f=@(x,y)(x.*y+exp(x)+y-5)
,因为你在矩阵X和Y上使用它。这已经为该函数提供了正确的结果。 -
您可以使用等值线绘制曲面的 2D 等值线图,这不是您希望用于查看 2D 函数零的轮廓图。 -> 改用
surf
-
你在维度
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)