python - 如何在 Python 中解决非线性系统
问题描述
我有三个不同的 3D 方程,我想得到它们之间的交集(系统的解)。我的变量是 x,y,z
方程式:
-0.006683 x**2 - 0.06893 x + 56.73- z = 0
0.002538 y**2 - 1.115 y + 56.73 - z = 0
(x-24.680)**2+(y-238.341)**2+(z+13.971)**2 = 12.580**2
如何在 python 中解决这个非线性系统?
解决方案
如果重写函数:
-0.006683 x**2 - 0.06893 x + 56.73- z = 0
0.002538 y**2 - 1.115 y + 56.73 - z = 0
(x-24.680)**2+(y-238.341)**2+(z+13.971)**2 - 12.580**2 = 0
这有点帮助。
你有三个方程和三个未知数。
蛮力法是遍历 x、y 和 z 值(在 x、y 和 z 的某个域上),并查看所有方程接近零的程度。
fa = -0.006683 x**2 - 0.06893 x + 56.73- z
fb = 0.002538 y**2 - 1.115 y + 56.73 - z
fc = (x-24.680)**2+(y-238.341)**2+(z+13.971)**2 - 12.580**2
使用“成本函数”,例如 cost=fa * fa + fb * fb + fc * fc ,并寻找最小值。
还有其他方法,例如 Nelder-Mead 方法,可以使用并且更有效。 https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method
一旦找到最小值,您就可以根据您需要的准确度来获取原始搜索范围并使其更精细。
@warped 提供了一个更好、更 Pythonic 的解决方案,但是,总是有可能没有解决方案或多个解决方案。顺便说一句,这是一个几何问题吗?最后一个方程看起来像一个球体的方程。
from scipy.optimize import fsolve
import math
def equations(p):
x, y, z = p
return (-0.006683 * x*x - 0.06893 * x + 56.73- z, \
0.002538 * y*y - 1.115 * y + 56.73 - z, \
(x-24.680)**2+(y-238.341)**2+(z+13.971)**2-12.580**2)
x, y, z = fsolve(equations, (1,1,1))
print (equations((x,y,z)))
print(x,y,z)
使用这个问题中提到的方法,使用 SymPy(@Oscar Benjamin 详细回答),如何使用 Python 求解一对非线性方程?
您可以通过其他方式找到其他解决方案。但是,这种方法没有找到任何解决方案,至少在我第一次尝试时是这样。
from sympy import *
x, y, z = symbols('x, y, z')
eq1 = Eq(-0.006683 * x * x - 0.06893 * x + 56.73- z, 0)
eq2 = Eq(0.002538 * y * y - 1.115 * y + 56.73 - z, 0)
eq3 = Eq((x-24.680)**2+(y-238.341)**2+(z+13.971)**2-12.580**2, 0)
sol = solve([eq1, eq2, eq3], [x, y,z])
print(sol)
print("")
if(len(sol)>1):
soln = [tuple(v.evalf() for v in s) for s in sol]
for idx, each in enumerate(soln):
print(idx,each)
推荐阅读
- vba - Excel VBA:PasteValues 如何在第二个循环中给出运行时错误 1004
- python - 张量流(label_image)中的input_layer是什么?
- javascript - 了解 || 的使用 在代码中
- asp.net - 此关联的主体端必须在 asp.net MVC 代码优先方法中显式配置,以用于一对多关系 crud 操作
- apache-kafka - 如何在 kafka 0.11 中重置偏移量
- android - 使用 RxJava2 缓冲来自 BLE 通知的图像
- java - 在 uClinux 上更新 java
- android - NestedScrollView 内容小于屏幕高度
- r - 如何通过使用 REGEX 在 R 中的特殊字符之前和之后提取字符串来创建数据框
- mysql - 无法从 Spring Boot 应用程序运行 flyway 脚本,数据库为 docker 容器中的 Mysql