2012-03-10 13 views
3

基本的には、ニュートンの方法でルートを見つけて、その数値をマイカラーに適用して、イテレーションの回数を長くし、色を濃くし、少ない、よりいっそう充実した色。ニュートンのメソッドの実行回数を確認するにはどうすればよいですか?

はそうここに私のコード

from numpy import * 
import pylab as pl 
def myffp(x): 
    return x**3 - 1, 3*(x**2)  
def newton(ffp, x, nits): 
    for i in range(nits): 
     #print i,x 
     f,fp = ffp(x) 
     x = x - f/fp 
    return x  
q = sqrt(3)/2 
def leggo(xmin=-1,xmax=1,jmin=-1,jmax=1,pts=1000,nits=30): 
    x = linspace(xmin, xmax, pts) 
    y = linspace(jmin, jmax, pts)*complex(0,1) 
    x1,y1 = meshgrid(x,y)     
    n = newton(myffp,x1+y1,nits)     #**here is where i wanna see the number of iterations newton's method takes to find my root** 
    r1 = complex(1,0) 
    r2 = complex(-.5, q) 
    r3 = complex(-.5,-q) 
    data = zeros((pts,pts,3)) 
    data[:,:,0] = abs(n-r1)   #**and apply it here** 
    data[:,:,2] = abs(n-r2) 
    data[:,:,1] = abs(n-r3) 
    pl.show(pl.imshow(data))  
leggo() 

主な問題は、反復回数を発見されたのです、私はその後、色を暗くすることを適用する方法を見つけ出すことができますが、今のところそれだけで反復回数を見つけるのITニュートンの方法によって各値が実行されます。

+0

をケビン:

ここで働くのpythonでの単純な実装だ、それはあなたが*あなたのSOの質問に*答えを受け入れる方法がわからないように見えます。シンプルですが、あなたが新しくなったときはそれほど明白ではありません。答えはあなたにとって有益だったと分かったら、その答えの左上隅にマウスを移動します(2つの灰色の三角形の間に答え "スコア"が表示されます)。スコアをマウスオーバーすると、「チェック」の概要が表示されます。そのチェックマークをクリックしてその回答を「受け入れる」。回答者のスコアで緑色のチェックが表示され、スコアに+2点が追加されます。 – doug

+0

私はスーパーに満足していませんか?彼らの誰も私の質問に実際に答えませんでした。彼らは間違いなく確かな答えですが、私は公差を使って何かを探していて、ニュートン法を止めて、最後にメソッドを止めるのに何回反復するのかを返します。あなたのdoug(epsと古いx)の回答は有望ですが、私は自分のコードに実装できませんでした。 – KevinShaffer

答えて

4

おそらく最も簡単な方法は、それが総イテレーションを追跡して、(もちろん、その結果と一緒に)それを返すようにちょうどあなたのニュートン機能をリファクタリングすることで、例えば、

def newton(ffp, x, nits): 
    c = 0     # initialize iteration counter 
    for i in range(nits): 
     c += 1    # increment counter for each iteration 
     f, fp = ffp(x) 
     x = x - f/fp 
    return x, c    # return the counter when the function is called 

ので、

res, tot_iter = newton(myffp, x, nits) 

目における反復回数:あなたのコードの本体、変更ニュートン、そのようにお電話でニュートンへの電子の最後の呼び出しは余談


tot_iter に格納され、ニュートン法の実装が不完全であると思われます。

たとえば、いくつかのコンバージェンス基準に対するテストがありません。

def newtons_method(x_init, fn, max_iter=100): 
    """ 
    returns: approx. val of root of the function passed in, fn; 
    pass in: x_init, initial value for the root; 
    max_iter, total iteration count not exceeded; 
    fn, a function of the form: 
    def f(x): return x**3 - 2*x 
    """ 
    x = x_init 
    eps = .0001 
    # set initial value different from x_init so at lesat 1 loop 
    x_old = x + 10 * eps   
    step = .1 
    c = 0 
    # (x - x_old) is convergence criterion 
    while (abs(x - x_old) > eps) and (c < max_iter): 
     c += 1 
     fval = fn(x) 
     dfdx = (fn(x + step)) - fn(x)/step 
     x_old = x 
     x = x_old - fval/dfdx 
    return x, c 
0

newton()に現在使用しているコードは、固定された回数(nits - これは30として渡されます)のため、結果は些細で面白くありません。

ニュートン・フラクタルを生成しようとしているようですが、使用しようとしている方法が間違っています。典型的なカラーモードは、反復回数ではなく、関数の出力に基づいています。詳しい説明はthe Wikipedia articleを参照してください。

+0

あなたの言っていることは分かります。私はちょうど私がルートに到達する反復の数を得ることができるかどうかを確認しようとしています。例 出発点x、またはコードx1 + y1の場合、ニュートン法が必要なルートに到達するまでの反復回数を知りたい。プログラムは30回反復実行されますが、最終結果を得るために必要な数字を何とか得ることができるかどうかを確認したいだけです。次にその結果を別の20回と言い返します。 – KevinShaffer

+0

幸いなことに、それは決してしません。それはちょうど反復ごとに連続的に(うまくいけば!)接近します。 – duskwuff

+0

これは会話に少し遅れますが、あなたは正しいです - @ duskwuff - あなたは、彼が毎回一定の反復回数を得て、それは面白くないと言うとき、反復回数がフラクタルを生成しないと言うのは間違いです。それは素敵なフラクタルを生み出します! – mrKelley

関連する問題