3

多項式に対応する係数のリストがあります。つまり、 に[1,2,0]対応しx^2 + 2x + 0ます。これらの係数の任意の長さの配列をラムダ関数に入れたいと思います。

具体的には、mpmathを使用しており、次のpolyval モジュールに使用されるリストがあります。

polyval(ctx, coeffs, x, derivative=False)

係数と数値を指定polyval()して、多項式を評価します。

そして 、一次元関数を取るfindroot モジュールを使用する必要があります。

findroot(lambda x: x**3 + 2*x + 1, 2)

係数のリストからラムダ関数を作成するにはどうすればよいですか?

4

4 に答える 4

7

本当にラムダ関数が必要ですか? 「通常の」関数を使用する方が簡単なはずです。

def poly(coeffs):
   def calc(x):
      result = 0
      for c in coeffs:
         result = result*x + c
      return result
   return calc

findroot(poly([1,2,0]))

そして、polyval()あなたが言及したその機能を使用すると、次のようなものが機能するはずです:

findroot(lambda x: polyval(ctx, [1,2,0], x))

(適正ctx値の場合)

于 2011-02-01T05:29:15.150 に答える
1

本当にラムダ式が必要な場合、私が考えることができるイージーセットは以下を使用していreduce()ます:

coeffs = [1, 2, 0]
f = lambda x: reduce(lambda y, a: x*y + a, coeffs, 0.0)
findroot(f, 2)

これもタグ付けされているためnumpy、次のようにも使用できますnumpy.poly1d

coeffs = [1, 2, 0]
f = numpy.poly1d(coeffs)
findroot(f, 2)
于 2011-02-01T10:45:54.730 に答える
1

sth のpolyval()ベースのアプローチが最良の答えのように見えますが (既にその関数にアクセスできるため)、独自の同等のものを実装したい場合、関数は次のようになります。

def poly(coeffs):
  def calc(x)
    result = 0
    for i,c in enumerate(reversed(coeffs)):
      result += c*(x**i)
    return result
  return calc

findroot(poly([1,2,0]))
于 2011-02-01T05:53:25.887 に答える
0

優れた Python ベース関数のおかげで、ラムダ式が可能です。最初のことは、強力なzip関数を介して (係数、指数) のカップルを取得することです。

>>> l = [3, 0, 4, -9]
>>> range(len(l) - 1, -1, -1)
[3, 2, 1, 0]
>>> zip(l, range(len(l) - 1, -1, -1))
[(3, 3), (0, 2), (4, 1), (-9, 0)]

rangeより大きな指数がリストの先頭にあるため、逆を使用します。多項式は合計です... 関数のおかげで計算されsumます !

>>> f = lambda x: sum([coef*x**exp for (coef, exp) in zip(l, range(len(l) - 1, -1, -1))])
>>> f(3)
84

そして確かに3*3^3 + 0*3^2 + 4*3^1 - 9*3^0 = 3*27 + 0 + 4*3 - 9*1 = 81 + 12 - 9 = 84。この の式は、 を使用しているため、その長さにf関係なくすべての coef のリストに対して正しいです。llen(l)

于 2011-02-01T10:04:13.367 に答える