【发布时间】:2014-02-11 11:30:04
【问题描述】:
我正在做一个项目,我正在使用根求解器来查找曲线的一些参数,这些参数会导致曲线的端点位于具有特定切向量 的特定位置 x1 >n1。我正在使用的参数是 Frenet-Serret 曲线,以防万一它有助于理解问题。
这是我试图找到根源的函数:
def f(x):
k0, k2, t0, t1, t2 = x
# s0, s1, and s2 are references into curve
s0.curvature = k0
s2.curvature = k2
s0.torsion = t0
s1.torsion = t1
s2.torsion = t2
r = curve.end_point(basis=True)
n1t, x1t = r[0][0], r[1]
dx = x1t-x1
dn = n1t-n1
return [dx[0], dx[1], dx[2], sum(dn), sum(dn**2)]
由于输入是一个 5 向量,因此它期望一个 5 向量作为输出,并且没有一种非常自然的方式来选择 5 个方程。我使用位置差异的分量,因为这是有道理的,并且法线向量的绝对差异似乎足够强。我只是添加了sum(dn) 部分,希望能给求解器提供更多信息。
我知道我在这里对曲线进行了就地修改,所以如果求解器没有收敛,它会使曲线处于令人讨厌的状态;这些实际上是副本,在接受输出之前我正在检查收敛性。现在我相当确定这不是现在的问题,因为我的问题发生在收敛期间,所以这让我认为这与我如何设置终止条件有关。
问题是绝大多数时候我得到了很好的解决方案,但有时,求解器会认为它找到了解决方案,而曲线的终点就会很远。或者,有时,求解器会陷入僵局,依次出现几个解决方案会非常糟糕。我错过了什么吗?是我的条件不够强还是有其他问题?
编辑:
有人询问有关 scipy 给我的结果对象的更多信息。我用xtol=1e-6 运行了这个试验,直到计算出的终点和终点切线似乎离目标远超过 0.1 个单位。
*******************************************************************************
Something seems to be the matter!
*******************************************************************************
The solution did converge yet...
- The absolute difference in the end point is 0.0108799344285
- The absolute difference in the end tangent is 0.225645622344
Here is the result from scipy:
status: 1
success: True
qtf: array([-0.05326282, -0.02382437, 0.14675375, -0.01343988, 0.04837993])
nfev: 51
r: array([ 4.10027838e-01, 2.80055126e-04, 2.72346438e-01,
1.88121754e-02, 3.03986277e-03, 3.76073132e-02,
-3.91459070e-03, -5.44385807e-02, -3.82769383e-02,
1.41418659e-01, -5.02200767e-02, -8.25093288e-03,
6.76335001e-02, 1.14316378e-02, 6.38501029e-05])
fun: array([-0.06421218, 0.10206985, 0.04248109, 0.07709824, 0.071918 ])
x: array([ -5.47581391e-02, 2.00109990e+07, 2.11915236e+01,
6.61899661e+05, -2.22193886e+07])
message: 'The solution converged.'
fjac: array([[-0.3207226 , -0.75566902, 0.53250215, -0.19842636, -0.05630082],
[-0.02198464, -0.00102108, 0.06437769, 0.4629469 , -0.88377108],
[-0.73103662, 0.31989562, 0.22322297, 0.48119372, 0.28614045],
[-0.44804528, 0.39203066, -0.01871625, -0.71533847, -0.36538741],
[ 0.40186388, 0.41586301, 0.81370645, -0.05523237, 0.01986423]])
x_calc: array([ 6.25753046, 2.99378609, 9.8221681 ])
x_target: array([ 6.31937831, 2.93663 , 9.76062169])
t_calc: array([ 0.75316478, -0.59352174, 0.28368074])
t_target: array([ 0.40709037, -0.69479177, 0.59290963])
【问题讨论】:
标签: python scipy mathematical-optimization