Passing extra arguments to broyden1

耗尽温柔 提交于 2021-01-01 06:52:51

问题


Im trying to execute scipy broyden1 function with extra parameters (called "data" in the example), here is the code:

data = [radar_wavelen, satpos, satvel, ellipsoid_semimajor_axis, ellipsoid_semiminor_axis, srange]
target_xyz = broyden1(Pixlinexyx_2Bsolved, start_xyz, args=data)

def Pixlinexyx_2Bsolved(target, *data):
    radar_wavelen, satpos, satvel, ellipsoid_semimajor_axis, ellipsoid_semiminor_axis, srange = data

    print target
    print radar_wavelen, satpos, satvel, ellipsoid_semimajor_axis, ellipsoid_semiminor_axis, srange

Pixlinexyx_2Bsolved is the function whose root I want to find.

start_xyz is initial guess of the solution:

start_xyz = [4543557.208584103, 1097477.4119051248, 4176990.636060918]

And data is this list containing a lot of numbers, that will be used inside the Pixlinexyx_2Bsolved function:

data = [0.056666, [5147114.2523595653, 1584731.770061729, 4715875.3525346108], [5162.8213179936156, -365.24378919717839, -5497.6237250296626], 6378144.0430000005, 6356758.789000001, 850681.12442702544]

When I call the function broyden1 (as in the second line of example code) I get the next error:

target_xyz = broyden1(Pixlinexyx_2Bsolved, start_xyz, args=data)
  File "<string>", line 5, in broyden1
TypeError: __init__() got an unexpected keyword argument 'args'

What I'm doing wrong?

Now, seeing the documentation of fsolve, it seems to be able to get extra args in the callable func... Here is a similar question as mine.


回答1:


There is a similar question at scipy's issue-tracker including a solution using python's functools-module (here: PEP 309 -- Partial Function Application ).

Small example based on the above link and the original problem from the docs:

import numpy as np
import scipy.optimize

""" No external data """
def F(x):
   return np.cos(x) + x[::-1] - [1, 2, 3, 4]
x = scipy.optimize.broyden1(F, [1,1,1,1], f_tol=1e-14)
print(x)

""" External data """
from functools import partial
def G(data, x):
    return np.cos(x) + x[::-1] - data
data = [1,2,3,4]
G_partial = partial(G, data)
x = scipy.optimize.broyden1(G_partial, [1,1,1,1], f_tol=1e-14)
print(x)

Out

[ 4.04674914  3.91158389  2.71791677  1.61756251]
[ 4.04674914  3.91158389  2.71791677  1.61756251]


来源:https://stackoverflow.com/questions/50040461/passing-extra-arguments-to-broyden1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!