0

Muller のアルゴリズムのこのコードを、基本的な Python プログラミングのみを含むクラスで適切に機能させるのに問題があります。私のプログラムには、出力のように虚数用のものはまだ含まれておらず、停止基準も適切に機能していませんが、現在、以下の出力の数値を正しく印刷することを主に懸念しています. このサイトを初めて使用したため、出力をコードとして投稿しましたが、「コードが正しくフォーマットされていません」というエラーが表示され続けました

どんな助けでも大歓迎です!

When f=(x-5)*(x-4)*(x+7)
and initial guesses are 1,3,and -10 
and tolerance = 0.000001

The output of this code should look like this:
The initial estimates to the root are:
f( 1 )= 96
f( 3 )= 20
f( -10 )= -630
0 : estimate to the root is f( 1 )= 96

1 : estimate to the root is f( (-4.102012878968893+0j) )= (213.71097514696675+0j)  

2 : estimate to the root is f( (3.463202253458595+0j) )= (8.63161417086553+0j)

3 : estimate to the root is f( (3.6797449479714586+0j) )= (4.515592141362759+0j) 

4 : estimate to the root is f( (3.9234514667540585+0j) )= (0.9001820953746444+0j)

5 : estimate to the root is f( (3.9988300605239253+0j) )= (0.012883020219233893+0j)

6 : estimate to the root is f( (3.9999973985379675+0j) )= (2.861615003307639e-05+0j)

The approximation to the root is f( (3.999999999978821+0j) ) = (2.329696435810382e-
10+0j)

これが私の実際のコードです:

import string
from math import *
from cmath import *

def evalFunction(f,x):
    x=eval(f)
    return x

def main():
    f= input("Input the function: ")
    p0=eval(input("Input the first estimate to the root of the function: "))
    p1=eval(input("Input the second estimate to the root of the function: "))
    p2=eval(input("Input the third estimate to the root of the function: "))
    t=eval(input("Enter the tolerance "))

    fp0=evalFunction(f,p0)
    fp1=evalFunction(f,p1)
    fp2=evalFunction(f,p2)

    print("The initial estimates to the root are:")
    print("f(",p0,")=",fp0)
    print("f(",p1,")=",fp1)
    print("f(",p2,")=",fp2)
    count=0
    print(count,": estimate to the root is f(",p0,")=",fp0)
    fp3=1

    while count<30:
        while (abs(fp3))>=t:
            fp0=evalFunction(f,p0)
            fp1=evalFunction(f,p1)
            fp2=evalFunction(f,p2)


            #Computes a,b,c 
            o=fp1-fp2
            n=fp0-fp2
            s=p1-p2
            r=p0-p2
            denom=r*s*(p0-p1)
            a=(s*n-r*o)/denom
            b=((r**2)*o-(s**2)*n)/denom
            c=fp2
            print()

            count=count+1

            #Computes the roots
            x1= (-2*c)/(b+(b**2-4*a*c)**.5)
            x2=(-2*c)/(b-(b**2-4*a*c)**.5)

            if b>0:
                p3= p2+x1
                fp3=evalFunction(f,p3)
                print(count,": estimate to the root is f(",p3,")=",fp3)
                print()

            else:
                p3= p2+x2
                fp3=evalFunction(f,p3)
                print(count,": estimate to the root is f(",p3,")=",fp3)
                print()

            p2=p3        

main()
4

1 に答える 1

1

プログラムのどの側面が機能していないかは完全には明らかではありませんが、許容範囲に達するとコードがハングアップする可能性がありcountます。外側のループ、while count<30:、永久に実行されます。

とにかく、シーケンスwhile count<30:を変更して、その問題while (abs(fp3))>=t:while count<30 and (abs(fp3))>=t:修正します。p0ループ内で更新されないという問題に関する回答の最後にあるメモを参照してくださいp1。これは、収束率を損なうと私が想像する問題です。

出力フォーマットについては、format以下のコードでの関数の使用を参照してください。このコードでは、読みやすくするために、ほとんどの等号の周りにスペースを追加し、コマンド ライン経由でパラメーターの入力を追加したことに注意してください。コマンド ラインに入力されていないパラメータは引き続き要求されます。MS-Windows マシンでコマンド ライン パラメータが同じ方法で取得されるかどうかはわかりません。

小数点以下の桁数が異なっていても、同じであっても、数値の実数部と複素数部を出力できることに注意してください。たとえば、c=3-5j; d=4.4+5.5j; print ('d: {.real:7.2f} {.imag:+.3f}j c: {:9.4f}'.format(d,d, c))を生成しd: 4.40 +5.500j c: 3.0000-5.0000jます。フォーマットの詳細については、Format Specification Mini-Language docs を参照してください。

以下に改訂されたプログラムを使用して、(プロンプトで入力したのと同じパラメーター)を介してLinuxシステムで実行すると、./mullermethod.py '(x-5)*(x-4)*(x+7)' 1 3 -10 0.000001印刷されます

The initial estimates to a root are:
f( 1.0 ) =  96.0
f( 3.0 ) =  20.0
f( -10.0 ) =  -630.0
 0: estimate to a root is f(  1.00000000000000) =  96.00000000000000
 1: estimate to a root is f( -4.10201287896889) = 213.71097514696675
 2: estimate to a root is f(  3.46320225345860) =   8.63161417086548
 3: estimate to a root is f(  3.90342357843416) =   1.15470992046251
 4: estimate to a root is f(  3.98002449809592) =   0.22371275706982
 5: estimate to a root is f(  3.99575149263503) =   0.04691400247817
 6: estimate to a root is f(  3.99909106270745) =   0.01000657113716
 7: estimate to a root is f(  3.99980529453210) =   0.00214213924168
 8: estimate to a root is f(  3.99995828046651) =   0.00045893227349
 9: estimate to a root is f(  3.99999106024078) =   0.00009833815063
10: estimate to a root is f(  3.99999808434378) =   0.00002107225517
11: estimate to a root is f(  3.99999958950253) =   0.00000451547380
12: estimate to a root is f(  3.99999991203627) =   0.00000096760109

その後、プログラムは終了します。

#!/usr/bin/env python3.2
from math import *
from cmath import *

def evalFunction(f,x):
    return eval(f)

def main():
    from sys import argv
    f  = argv[1]           if len(argv)>1 else input("Input the function: ")
    p0 = float(argv[2])    if len(argv)>2 else eval(input("Input the first estimate to a root of the function: "))
    p1 = float(argv[3])    if len(argv)>3 else eval(input("Input the next  estimate to a root of the function: "))
    p2 = float(argv[4])    if len(argv)>4 else eval(input("Input the third estimate to a root of the function: "))
    toler = float(argv[5]) if len(argv)>5 else eval(input("Enter the tolerance: "))

    fp0 = evalFunction(f,p0)
    fp1 = evalFunction(f,p1)
    fp2 = evalFunction(f,p2)

    print("The initial estimates to a root are:")
    print("f(",p0,") = ",fp0)
    print("f(",p1,") = ",fp1)
    print("f(",p2,") = ",fp2)
    count = 0
    print ('{:2}: estimate to a root is f({:18.14f}) = {:18.14f}'.format(count,p0,fp0))
    fp3 = 1e9

    while count<30 and abs(fp3) >= toler:
        fp0 = evalFunction(f,p0)
        fp1 = evalFunction(f,p1)
        fp2 = evalFunction(f,p2)

        #Computes a,b,c 
        o = fp1-fp2
        n = fp0-fp2
        s = p1-p2
        r = p0-p2
        denom = r*s*(p0-p1)
        a = (s*n-r*o)/denom
        b = ((r**2)*o-(s**2)*n)/denom
        c = fp2
        count += 1

        #Compute roots
        x1 = (-2*c)/(b+(b**2-4*a*c)**.5)
        x2 = (-2*c)/(b-(b**2-4*a*c)**.5)

        if b>0:
            p3 = p2+x1
        else:
            p3 = p2+x2

        fp3=evalFunction(f,p3)
        print ('{:2}: estimate to a root is f({:18.14f}) = {:18.14f}'.format(count,p3,fp3))
        p2 = p3        

main()

ループ内で変更が行われていないことに注意してください(したがって、ループ内で変更しp0ないでください)。ウィキペディアからの私の印象は、あなたが言うところのようなことをすべきだということです。また、関数の評価を減らすために、ループ内の と の評価を削除できます。p1fp0fp1p0, p1, p2 = p1, p2, p3p2 = p3fp0fp1fp2p0, p1, p2 = p1, p2, p3p0, p1, p2, fp0, fp1, fp2 = p1, p2, p3, fp1, fp2, fp3

p0, p1, p2 = p1, p2, p3の代わりに を 使用p2 = p3すると、半分の反復回数で (別のルートに対して) はるかに近い結果が得られます。

tini ~/sp/math > ./mullermethod.py '(x-5)*(x-4)*(x+7)' 1 3 -10 0.000001
The initial estimates to a root are:
f( 1.0 ) =  96.0
f( 3.0 ) =  20.0
f( -10.0 ) =  -630.0
 0: estimate to a root is f(  1.00000000000000) =  96.00000000000000
 1: estimate to a root is f( -4.10201287896889) = 213.71097514696675
 2: estimate to a root is f( -6.34710329529507) =  76.65637351948691
 3: estimate to a root is f( -6.95941163108092) =   5.31984100233008
 4: estimate to a root is f( -7.00059085626200) =  -0.07800105634618
 5: estimate to a root is f( -6.99999988135762) =   0.00001566079365
 6: estimate to a root is f( -6.99999999999998) =   0.00000000000281
于 2013-03-05T05:35:07.200 に答える