44197


(参考)SymPyにおいて関数を関数で置き換えて（≠代入）三角関数の加法定理を証明しよう  
<https://qiita.com/HigashinoSola/items/9fdff5c849445c5c1607>

[code]

    from sympy import *
    var('u v w t')
    myFn1 = Function('myFn1')
    myFn2 = Function('myFn2')
    myFn3 = Function('myFn3')
    print('--------------------------------------------------')
    v=cos(u)
    print('v=',v)
    print('v=',expand(v.replace(cos,sin)))
    print('v=',expand(v.replace(u,w)))
    print('--------------------------------------------------')
    v=myFn1(u)
    print('v=',v)
    print('v=',expand(v.replace(myFn1,myFn2)))
    print('v=',expand(v.replace(u,w)))
    #v= cos(u)
    #v= sin(u)
    #v= cos(w)
    #v= myFn1(u)
    #v= myFn2(u)
    #v= myFn1(w)
    print('--------------------------------------------------')
    v=myFn1(u)
    print('v=',v)
    print('v=',expand(v.replace(myFn1,myFn3).replace(u,'u,t')))
    
[/code]

エラー: "given an expression, replace() expects "  
出力したいもの  
myFn3(u,t)  
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー  
(2018-05-23) 1,2できました。ありがとうございました。  
FullScript

[code]

    from sympy import Function, Wild
    from sympy.abc import x, y
    print('------------------------------------------')
    f = Function('f')
    g = Function('g')
    v = f(x) + f(x + 1)
    print('v =',v)
    print('v1=',v.replace(f(x), g(x, y)))
    a =Wild('a')
    print('v2=',v.replace(f(a), lambda a: g(a, y)))
    v = f(x) + f(x + 1)
    v1= f(x + 1) + g(x, y)
    v2= g(x, y) + g(x + 1, y)
    print('------------------------------------------')
    myFn1 = Function('myFn1')
    myFn3 = Function('myFn3')
    v = myFn1(x)
    print('v  =',v)
    b =Wild('b')
    print('v3b=',v.replace(myFn1(b), lambda b: myFn3(b, y)))
    # u = Wild('u')
    # print('v3u=',v.replace(myFn1(u), lambda a: myFn3(u, y)))
    # TypeError: <lambda>() got an unexpected keyword argument 'u'
    #
    # v = f(x) + f(x + 1)
    # v1= f(x + 1) + g(x, y)
    # v2= g(x, y) + g(x + 1, y)
    # v = myFn1(x)
    # v3b= myFn3(x, y)
    
[/code]

使える文字と使えない文字の違いの原因は、わかりませんでした。


CC BY-SA 4.0
2018-05-23T14:13:37.690
44193
2018-05-24T13:15:38.963
2018-05-24T13:15:38.963
17199
17199
question
python sympy
SymPyにおいて関数を関数で置き換えて,replaceで「引数の数を増やす事」は可能ですか?


目的にあわせて、ふたつのやり方を紹介します。1引数の関数 `f` と、2引数の関数 `g` があるとして説明します。

[code]

    # つまり、こういう設定です。v 中の f を置換したいです。
    from sympy import Function, Wild
    from sympy.abc import x, y
    f = Function('f')
    g = Function('g')
    v = f(x) + f(x + 1)
    
[/code]

  1. `f` に `x` が適用されている部分すべてを `g(x, y)` にしたい場合、直接 `f(x)` を `replace` すれば良いです。
[code]     >>> v.replace(f(x), g(x, y))

    f(x + 1) + g(x, y)
    
[/code]

  2. `f` に何か引数が適用されている部分すべてを、その引数を第一引数、`y` を第二引数として `g` に適用するようにしたい場合、パターンを利用して `replace` すれば良いです。
[code]     >>> a = Wild('a')

    >>> v.replace(f(a), lambda a: g(a, y))
    g(x, y) + g(x + 1, y)
    
[/code]

`replace`
関数のより詳しい使い方については、[こちらの公式ドキュメント](http://docs.sympy.org/latest/modules/core.html#sympy.core.basic.Basic.replace)に載っています。特に下の方に載っている
Examples をご参照ください。


CC BY-SA 4.0
2018-05-23T16:47:58.900
44197
2018-05-23T17:37:32.183
2018-05-23T17:37:32.183
19110
19110
44193
answer