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])