Почему моей функции подгонки python lmfit наименьших квадратов передается слишком много аргументов?

Я пытался найти кого-то, кто совершает ту же ошибку, что и я, но не получил никакой радости! Это также мой 1-й пост, поэтому я извиняюсь, если он плохо объяснен или направлен. Совет приветствуется.

Проблема, которую я решаю, заключается в следующем: определение положения какого-либо приемника путем измерения расстояний до ряда известных опорных точек. Это базовая трилатерация, и я использую для этого метод наименьших квадратов.

Я уже успешно использовал функцию scipy.optimize lesatsq для этого, поэтому я почти уверен, что моя подходящая функция работает. Тем не менее, я хочу иметь возможность использовать некоторые дополнительные функции, которые предлагает пакет lmfit Python, и я изо всех сил пытаюсь перевести его на другие языки. Полный код попытки находится здесь: http://pastebin.com/4xbfkaCm.

Функция минимизации lmfit устанавливает вызовы моей функции подгонки (которая называется остаточным функцио- нированием ) следующим образом: массив stationarray представляет собой пустой массив, содержащий местоположения и диапазоны станций, а params представляет собой словарь параметров, которые будут использоваться в функции подгонки.

position = minimize(residualfunct, params, args=(stationarray))

и моя подгоночная функция определяется как

def residualfunct(params, stationarray):

    X = params['solutionX'].value
    Y = params['solutionY'].value
    Z = params['solutionZ'].value
    result = numpy.array([s[3] - linalg.norm(array((X,Y,Z))-array((s[0],s[1],s[2]))) for s in stationarray])
    print result
    return result

Когда я запускаю этот код, я получаю TypeError:

Остаточная функция() принимает ровно 2 аргумента (5 задано).

поскольку этот вызов выполняется функцией минимизации, я не вижу, какой контроль у меня есть над этим. Я могу только представить, что это поднимается, потому что я передаю np.array в качестве аргумента, но это кажется неизбежным. Может ли кто-нибудь увидеть, что я делаю неправильно?

Спасибо


person mrscruff    schedule 23.07.2014    source источник
comment
Вам нужно показать полную трассировку, так как она покажет, что вызывает функцию и что она передает.   -  person Daniel Roseman    schedule 23.07.2014


Ответы (1)


В вызове minimize измените

args=(stationarray)

to

args=(stationarray,)

args должна быть последовательностью (обычно кортежем), элементами которой являются аргументы, передаваемые функции. Чтобы создать кортеж длины 1, вам понадобится дополнительная запятая. Когда вы пишете args=(stationarray) (без лишней запятой), круглые скобки не действуют, и это то же самое, что писать args=stationarray. Затем minimize вызывает функцию как residualfunct(params, stationarray[0], stationarray[1], ...), что приводит к ошибке, о которой вы сообщили.

person Warren Weckesser    schedule 23.07.2014
comment
Большое вам спасибо, это сработало отлично, и (после исправления всех других проблем, которые я впоследствии обнаружил :)) код теперь работает так, как мне нужно. Я бы проголосовал, если бы у меня было достаточно репутации. - person mrscruff; 23.07.2014