38793


今、 sympy で記述された2次方程式があるとします。

[code]

    # 例えば、このような形で与えられる多項式、
    # 実際のそれぞれの項の係数は、
    # プログラムを実行してみるまでわからない
    import sympy as sp
    x = sp.Symbol('x')
    quad_poly = (x-10)**2 + 10
    
[/code]

この `quad_poly` に対しての、原点からの接線の傾きを求めたいです。  
「x についての2次方程式が重解になるような a を求めよ」  
の関数があれば実現できると思うのですが、それが見つけられずにいます。  
このような関数は sympy にありますでしょうか？

[code]

    a = sp.Symbol('a')
    finding_a_eq = quad_poly - a*x
    # こんな関数はないでしょうか。。？
    sp.find_double_root(finding_a_eq, x)
    
[/code]


CC BY-SA 3.0
2017-10-17T06:54:54.383
38787
2017-10-19T13:02:40.643
754
question
python sympy
sympy で与えられた2次関数に対して、原点からの接線の傾きを求めたい


[sympyのcoeffの使い方を教えて下さい](https://ja.stackoverflow.com/q/33677/754) を参考に、
`Poly` と `coeff_monomial` を用いればすぐに実装できることに気づきました。

[code]

    from sympy import *
    
    x = Symbol('x')
    quad = (x-10)**2 + 10
    
    def find_double_root(quad_poly_ish, var, solve_for):
        p = Poly(quad_poly_ish, var)
        a = p.coeff_monomial(var**2)
        b = p.coeff_monomial(var**1)
        c = p.coeff_monomial(var**0)
    
        determinant = b**2 - 4*a*c
        eq = Eq(determinant, 0)
        return solve(eq, solve_for)
    
    a = Symbol('a')
    arr = find_double_root(quad - a*x, x, a)
    
    print arr[0].evalf()
    print arr[1].evalf()
    
    # => 0.976176963403031
    # => -40.9761769634030
    
[/code]


CC BY-SA 3.0
2017-10-17T07:48:28.887
38793
2017-10-17T07:48:28.887
754
38787
answer


sympyのcoeffを使わずにやってみました。結果がちょと違いました。

[code]

    from sympy import *
    var('x aa')
    quad = (x-10)**2+10
    line = aa*x
    kekka=solve([Eq(quad,line), Eq(diff(quad,x),diff(line,x))])
    print("# =>", float(kekka[0][aa]))
    print("# =>", float(kekka[1][aa]))
    # => 0.976176963403031
    # => -40.976176963403034
    
[/code]


CC BY-SA 3.0
2017-10-19T13:02:40.643
38871
2017-10-19T13:02:40.643
17199
38787
answer