1

Pythonを使用して、次の暗黙の方程式を数値的に解こうとしています:

y*sin(c)+sin(y*c)=0

c定数です。どのようにすればよいでしょうか?古典的なニュートン ラフソン法を実装しましたが、収束していないようです。

編集:

コードは次のとおりです。

f = open('results.dat','w')

import math

alpha = input('Define the alpha angle: ')

print >> f, 'alpha =', alpha

lambda_0 = input('Define an initial value: ')

print >> f, 'y_0 = ', y_0

gamma = math.pi - math.radians(alpha)

# def f(x,y):
#   p = 2.0 * x
#   t = p * y
#   val  = t * math.cos(t) - math.sin(t)
#   val /= (p * math.cos(t) + math.sin(p))
#   return val

toll = 1e-12

itmax = 50

diff = 1.0

it = 0

while diff > toll and it <= itmax:
    p = 2.0 * gamma
    t = p * y_0
    y_1  = t * math.cos(t) - math.sin(t)
    y_1 /= (p * math.cos(t) + math.sin(p))

    print >> f, 'p = ', p

    print >> f, 't = ', t

    print >> f, 'y at iteration ', it, ' = ', y

    diff = abs(y - y_0)
    y_0 = y
    it += 1

    print >> f, 'diff = ', diff

    print >> f, 'y_0 = ', y_0

    print >> f, 'it = ', it

f.close()
4

3 に答える 3

2

これがあなたの解決策です:y = 0

多分あなたは非ゼロの解決策を意味しますか?または、他の何か?

編集:もう少し便利なものを追加

より素敵なフォルムへの変身

最初の肯定的な解決策が必要であると仮定すると、次のことができます。

を使用して座標を変換するz=y*cと、方程式が得られます。

 A*z = sin(z)

どこでA = -sin(c)/c

これは、勾配 A の原点を通る直線と通常の正弦曲線との交点を決定しています。

これを図にすると、解|A| >= 1しかないことがわかります。z=0

メソッドを正しい根に収束させる際の問題の一部は、根に近い開始値を選択することです。この場合、これらの根を近似できます。

臨界勾配ケース (|A|~1)

1 に近い場合|A|、0 に近い正と負の解があることがわかります。これらは、正弦の低次テイラー級数を使用して近似できます。

A*z = z - z^3/6 + ...

これに対するおおよその解は z=0 で z=Rz=-RどこでR=sqrt( 6 (1-A) ). これは、|A|ほぼ 1 の場合、数値推定の適切な出発点は次のとおりであることを示唆しています。

y=(1/c) sqrt( (6/c)( 1 + sin(c) ) )  

傾きが小さい場合 ( |A|~0 )

A が小さい場合、 に近い解が期待されpiます。この場合、さらに変数を変更しますz=p+pi

 A (p + pi) = sin( p + pi ) = -sin(p)

罪を再び拡大すると、次のことがわかります。

A p  + A pi = -p + ...

これにより、次の近似解が得られます。

p = - A pi / (A+1)

これは単純化します

z = pi/(A+1)

これは、次の開始点を探す必要があることを意味します。

y = pi/(c(A+1))

近似の使用

線形補間を使用してこれら 2 つの値をブレンドすることで、おそらく開始点を選択します。

A = 2/pi「中間」値の近くで同様の拡張を行い、線形補間で 3 点を使用することもできます。

これらの近似から始めれば、ニュートン法を目的の値に収束させるのに十分な場合があります。ただし、正しい根への収束を確実にする必要がある場合は、おそらくニュートン ラフソンを削除し、これらの値を正割法または二分法の開始点として使用する必要があります。

于 2012-04-11T08:19:43.030 に答える
2

Newton raphson が機能しない場合は、おそらくBisectionのような単純なものを試す必要があります。時間の複雑さは依然として O(n) のオーダーです。ここで、n は精度のビット数です。

于 2012-04-10T21:16:53.553 に答える
1

これは、ランダム c (8) の曲線です。

私が見る限り無限の解決策があるので、見つけるのは難しくありません。よく書かれた Raphson-Newton の scipy を見てください (あなたのコードはおそらく間違っています)。ここを見てください: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html

于 2012-04-10T21:02:45.813 に答える