2014-01-26 3 views
2

Я работаю над проектом, в котором я использую корень-решатель, чтобы найти некоторые параметры кривой, которые приводят к тому, что конечная точка кривой будет находиться в определенном месте. x1 с конкретным вектором касательной n1. Параметры, с которыми я работаю, - это кривые Frenet-Serret, если это поможет понять проблему.Почему scipy.optimize.root сходится к неправильному решению?

Вот функция, которую я пытаюсь найти корни:

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), чтобы, надеюсь, дать решателю немного больше информации.

Я знаю, что здесь я делаю модификацию на месте, поэтому, если решатель не сходится, он оставляет эту кривую в неприятном состоянии; это на самом деле копии, и я проверяю конвергенцию, прежде чем я соглашусь с выходом. Теперь я уверен, что сейчас это не проблема, так как моя проблема возникает во время конвергенции, поэтому мне кажется, что это связано с тем, как я установил условия для завершения.

Проблема в подавляющем большинстве случаев, когда я получаю хорошие решения, но время от времени решатель будет считать, что он нашел решение, а конечная точка кривой будет просто выключена. Или, иногда, решатель застрянет в колеи, и несколько решений в последовательности будут очень плохими. Я что-то упускаю? Являются ли мои условия недостаточно сильными или что-то еще?

EDIT:

Кто-то запросил дополнительную информацию о результате объект 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]) 

ответ

1

Функция scipy.optimize.root возвращает объект OptimizeResult.

Мне любопытно, каковы значения полей «success», «status» и «message» в объекте OptimizeResult, возвращаемого scipy.optimize.root?

Например, сообщение может быть что-то вроде этого:

  • 'Итерация не делает хороший прогресс, как измеряется улучшение от последних десяти итераций.

Кстати, взгляните на minpack.py, чтобы увидеть другие возможные проблемы, с которыми вы могли столкнуться.

+0

Насколько я знаю, все эти значения указывают на успех; Я написал код, который проверяет флаг '' success'', и, насколько я знаю, я принимаю только те результаты, которые сходились. Я собираюсь запустить еще один тест, чтобы я мог сделать более правильную посмертную смерть. Хотя, факт, что ничего не выпрыгивает из бит кода, который я написал, заставляет меня думать, что есть что-то еще, что я просто не вижу. – OEP

+0

Я разместил немного больше информации.Параметры кривой не очень «хороши», но я сомневаюсь, что они должны быть. – OEP

+0

Я начинаю думать, что, возможно, я сделал наивный выбор '' xtol''. Я установил его '' 1e-6'', где по умолчанию используется '' 1.49012e-08'' для функции '' _root_hybr''. Обычно я не думал, что это сделает большую разницу, но, видимо, для этого приложения. – OEP

0

Для этой проблемы в конечном итоге это был плохой выбор толерантности.

Смежные вопросы