尝试计算笛卡尔系统中未知坐标的位置时形状不匹配

问题描述 投票:0回答:1

问题

大家好,我正在尝试制作一个系统,可以使用 OpenCV 在天花板上绘制标记。为此,我需要能够使用旧标记的已知位置来计算新标记的位置。当我运行下面的脚本时,出现以下错误:

TypeError:fsolve:输入和输出之间不匹配 “func”参数“unknown_point_equations”的形状。形状应该是 (2,) 但它是 (3,)。

预期结果

预期结果当然是 (x,y) 的正确坐标,而不是错误。

代码

import numpy as np
from scipy.optimize import fsolve

def unknown_point_equations(variables, x1, y1, d1, x2, y2, d2, x3, y3, d3):
    x, y = variables
    eq1 = (x - x1)**2 + (y - y1)**2 - d1**2
    eq2 = (x - x2)**2 + (y - y2)**2 - d2**2
    eq3 = (x - x3)**2 + (y - y3)**2 - d3**2
    return [eq1, eq2, eq3]

def calculate_unknown_point(x1, y1, d1, x2, y2, d2, x3, y3, d3):
    # Initial guess for the unknown point
    initial_guess = [0, 0]

    # Solve the system of equations
    result, infodict, ier, msg = fsolve(unknown_point_equations, initial_guess, args=(x1, y1, d1, x2, y2, d2, x3, y3, d3), full_output=True)

    if ier != 1:
        raise RuntimeError(f"fsolve did not converge: {msg}")

    # Extract the coordinates of the unknown point
    x_p, y_p = result[0], result[1]

    return x_p, y_p

复制价值

x1, y1, d1 = 324,300,147

x2, y2, d2 = 278,414,224

x3, y2, d3, = 357,437,276
python math
1个回答
0
投票

您的输入和输出不匹配。您的输入是

initial_guess = [0, 0]

你的输出是,根据

unknown_point_equations
的函数签名:

[eq1, eq2, eq3]

您可以通过使用虚拟变量来解决此问题。如果你的函数没有从 N 长度向量到 N 长度向量,

fsolve
会很不高兴(本质上,你的函数必须是线性映射)。

我的直觉是,你最初的猜测应该是

[0, 0, 0]
,你不应该对第三个变量做任何事情。狩猎快乐!

import numpy as np
from scipy.optimize import fsolve

def unknown_point_equations(variables, x1, y1, d1, x2, y2, d2, x3, y3, d3):
    x, y, _ = variables
    eq1 = (x - x1)**2 + (y - y1)**2 - d1**2
    eq2 = (x - x2)**2 + (y - y2)**2 - d2**2
    eq3 = (x - x3)**2 + (y - y3)**2 - d3**2
    return [eq1, eq2, eq3]

def calculate_unknown_point(x1, y1, d1, x2, y2, d2, x3, y3, d3):
    # Initial guess for the unknown point
    initial_guess = [0, 0, 0]

    # Solve the system of equations
    result, infodict, ier, msg = fsolve(
      unknown_point_equations,
      initial_guess,
      args=(x1, y1, d1, x2, y2, d2, x3, y3, d3),
      full_output=True
    )

    if ier != 1:
        raise RuntimeError(f"fsolve did not converge: {msg}")

    # Extract the coordinates of the unknown point
    x_p, y_p, _ = result

    return x_p, y_p

(尽管如此,就其价值而言,它对于您提供的值并不收敛。您需要一个不同的起点。)

© www.soinside.com 2019 - 2024. All rights reserved.