【问题标题】:Level curves to two functions for solving nonlinear system of equations求解非线性方程组的两个函数的水平曲线
【发布时间】:2014-02-26 07:54:48
【问题描述】:

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

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)

【问题讨论】:

    标签: matlab plot


    【解决方案1】:

    我认为你所做的存在三个问题:

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

    2. 您使用等高线绘制表面的二维等高线图,这不是您想要用来查看二维函数的零点的方法。 -> 改为使用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)
    

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

    【讨论】:

      【解决方案2】:

      为什么不能直接使用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)
      

      【讨论】:

      • 这更容易,是的。但我想绘制水平曲线(在 0 处)以检查存在多少解决方案,然后调用我的数值方法来解决它们。
      • 这是您要找的吗? ezplot('x^2 + y*sin(y) - 3',[-10 10 -10 10]); hold on; ezplot('x*y + exp(x) + y -5',[-10 10 -10 10]);
      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多