You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scipy.optimize求解多变量方程的根(附自定义函数)

使用scipy.optimize求解多变量方程的根

要解决你这个包含theta1、theta2两个变量的方程组(也就是让x(theta1, theta2, ...)=0和y(theta1, theta2, ...)=0同时成立),你可以用scipy.optimize模块里的非线性方程组求解工具,比如root或者fsolve。这两个工具都能处理多变量根求解问题,核心是把你的两个单输出函数包装成一个向量值函数——输入一个参数向量,输出对应维度的结果向量。

首先我把你提供的y函数补全(看起来是输入到一半截断了,我按常见的连杆机构逆解逻辑补全,如果你的实际表达式不同,直接替换即可),然后整合到统一的目标函数里:

import numpy as np
import scipy.optimize as optimize

# 定义x函数
def x(theta1, theta2, w, h, L1, L2):
    sint1 = np.sin(theta1)
    cost1 = np.cos(theta1)
    sint2 = np.sin(theta2)
    cost2 = np.cos(theta2)
    i1 = L1 * (cost1 + cost2) + w
    j1 = L1 * (sint1 - sint2) - h
    D = np.sqrt((L1*(cost2-cost1)+w)**2+(L1*(sint2-sint1)+h)**2)
    a = (0.25)*np.sqrt((4*L2**2-D**2)*D**2)
    return i1/2 + 2*j1*a/(D**2)

# 补全后的y函数(若你的实际表达式不同,替换此处计算逻辑)
def y(theta1, theta2, w, h, L1, L2):
    sint1 = np.sin(theta1)
    cost1 = np.cos(theta1)
    sint2 = np.sin(theta2)
    cost2 = np.cos(theta2)
    i1 = L1 * (cost1 + cost2) + w
    j1 = L1 * (sint1 - sint2) - h
    D = np.sqrt((L1*(cost2-cost1)+w)**2+(L1*(sint2-sint1)+h)**2)
    a = (0.25)*np.sqrt((4*L2**2-D**2)*D**2)
    return j1/2 - 2*i1*a/(D**2)

# 封装成scipy求解器需要的向量值函数
def equations(vars, w, h, L1, L2):
    theta1, theta2 = vars
    return [
        x(theta1, theta2, w, h, L1, L2),
        y(theta1, theta2, w, h, L1, L2)
    ]

接下来是具体的求解步骤:

求解流程

  1. 设定固定参数:先确定w、h、L1、L2这些已知参数的具体值,这里我给一组测试值,你根据实际需求替换:
# 示例固定参数(按需修改)
w = 1.0
h = 0.5
L1 = 2.0
L2 = 2.5
  1. 给出初始猜测值:非线性方程组的求解非常依赖初始猜测,建议根据你的物理场景(看起来像是连杆机构的逆运动学问题)给一个合理的初始值,比如:
# theta1和theta2的初始猜测(弧度值)
initial_guess = [0.0, 0.0]
  1. 调用求解器求解:这里推荐用optimize.root,它会返回更详细的求解信息;你也可以用optimize.fsolve,用法类似:
# 调用root求解,args传递固定参数
result = optimize.root(equations, initial_guess, args=(w, h, L1, L2))

# 检查并输出结果
if result.success:
    theta1_sol, theta2_sol = result.x
    print(f"求解成功!theta1 = {theta1_sol:.4f} 弧度,theta2 = {theta2_sol:.4f} 弧度")
    # 验证解是否满足原方程
    print(f"x函数计算值:{x(theta1_sol, theta2_sol, w, h, L1, L2):.6f}")
    print(f"y函数计算值:{y(theta1_sol, theta2_sol, w, h, L1, L2):.6f}")
else:
    print(f"求解失败,原因:{result.message}")

关键注意点

  • 初始值调整:如果求解失败,大概率是初始猜测值离真实根太远,试试换成更贴近实际的初始值(比如[np.pi/4, np.pi/4])。
  • 参数传递:args参数用来传递方程组中的固定参数,确保求解器只对theta1和theta2进行优化。
  • 多解问题:这类连杆机构的逆解通常有多个可行解,更换初始值可能会得到不同的有效根。

内容的提问来源于stack exchange,提问作者Eduardo Vieira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:17:50