Python 从两个曲面的交点z=z(x,y)求出方程y=y(x)

Python 从两个曲面的交点z=z(x,y)求出方程y=y(x),python,numpy,scipy,surface,nonlinear-functions,Python,Numpy,Scipy,Surface,Nonlinear Functions,给定两个曲面的方程z=z(x,y)I和II: z_I(x, y) = a0 + a1*y + a2*x + a3*y**2 + a4*x**2 + a5*x*y z_II(x, y) = a0_s2 + a1_s2*y + a2_s2*x + a3_s2*y**2 + a4_s2*x**2 + a5_s2*x*y 代码中给出了参数(如下) 两个曲面的交点满足以下条件: z_I(x, y) = z_II(x, y) 我怎样才能找到这个交叉点的方程y=y(x) 代码: 编辑 正如@Alex

给定两个曲面的方程
z=z(x,y)
I
II

z_I(x, y) = a0 + a1*y + a2*x + a3*y**2 + a4*x**2  + a5*x*y
z_II(x, y) = a0_s2 + a1_s2*y + a2_s2*x + a3_s2*y**2 + a4_s2*x**2  + a5_s2*x*y

代码中给出了参数(如下)

两个曲面的交点满足以下条件:

z_I(x, y) = z_II(x, y)

我怎样才能找到这个交叉点的方程
y=y(x)

代码:

编辑

正如@Alex所指出的,得到了两个解,即两个曲面相交定义了两条曲线:

如果运行以下代码,则可在
sol
中获取这些代码:

sol=sym.solve(z_I(x,y)-z_II(x,y,y)

现在,如果我们绘制这两条曲线(所有这些都在下面的代码中),我们会发现这两条分支:

我意识到,对于
x
y
域,当一个曲面(即绿色曲面)位于红黄色曲面的顶部时,这是正确的:

我想找到这两个分支之间的交点(2D图中的蓝色和橙色)

根据所讨论的内容,这也可以通过
sym.solve
完成:

cross=sym.solve(y_sol_z_I_sym(x)-y_sol_z_II_sym(x),x)

但是,此语句不适用于
sym.sqrt
(应该如此,因为平方根被视为符号…)

你知道问题出在哪里吗

代码:


由于您正在寻找符号解决方案(而不是数字),因此需要一个用于符号操作的库,例如SymPy

import sympy as sym
x, y = sym.symbols('x y', real=True)
z_I = a0 + a1*y + a2*x + a3*y**2 + a4*x**2  + a5*x*y
z_II = a0_s2 + a1_s2*y + a2_s2*x + a3_s2*y**2 + a4_s2*x**2  + a5_s2*x*y
sol = sym.solve(z_I-z_II, y)
数组
sol
包含两个解,这对于二次方程来说并不少见

[0.000319359080035813*x - 1.22230952828787e-15*sqrt(-1.07919313606384e+24*x**2 + 2.00910207755286e+28*x - 1.12101975048632e+30) + 10.6162640815323, 
 0.000319359080035813*x + 1.22230952828787e-15*sqrt(-1.07919313606384e+24*x**2 + 2.00910207755286e+28*x - 1.12101975048632e+30) + 10.6162640815323]
如果你想找到他们相遇的地方,使用

cross = sym.solve(sol[0]-sol[1])

它返回交点的x坐标。

“我怎样才能找到这个交点的方程y=y(x)?-你需要解由
z_I(x,y)=z_II(x,y)
给出的二次方程。你在问数学问题吗?谢谢你的回答。我对这两种解决方案考虑了很多,并得出了一个结论。请参见上面的编辑。再次感谢您尝试将Python函数等同于(好像使用了来自SciPy的数值解算器)而不是SymPy表达式。请参阅更新后的答案。
sym.solve(sol[0]-sol[1])
返回错误
RuntimeError:调用Python对象时超出了最大递归深度
感谢sympy 1.1中的我。试试这个,不要带任何额外的负担,只要我答案中的代码加上你帖子中常量的定义。代码中有一些冗余的导入语句。通过运行代码并升级到sympy 1.1,可以知道交点的
x
y
坐标。因此,
cross=sym.solve([sol[0]-y,sol[1]-y],[x,y])
应该返回两个坐标。但是,它返回一个空列表,
cross=[]
您知道为什么会发生这种情况吗?谢谢你的帮助
[0.000319359080035813*x - 1.22230952828787e-15*sqrt(-1.07919313606384e+24*x**2 + 2.00910207755286e+28*x - 1.12101975048632e+30) + 10.6162640815323, 
 0.000319359080035813*x + 1.22230952828787e-15*sqrt(-1.07919313606384e+24*x**2 + 2.00910207755286e+28*x - 1.12101975048632e+30) + 10.6162640815323]
cross = sym.solve(sol[0]-sol[1])