این برنامه برای الگوریتم نیوتن-رافسون، برای بدست آوردن ریشهی تابع
f(x) = 3**x - 1.39
در بازهی
(.5,3)
و دقت محاسبهی جواب
ep = 10**(-4)
و معیار توقف
abs( c[n] - c[n-1] ) > ep or abs( ( c[n] - c[n-1] ) / c[n] ) > ep or abs( f( c[n] ) > ep
نوشته شده است.
همچنین برای مشتقگیری از ماژول Mpmath استفاده شده است.
from mpmath import * # mpmath Option mp.dps = 10; mp.pretty = True #------ Input ---------------- def f(x): return 3**x-1.39 d = [0.5, 3.] ep = 10**(-4) #------ calc ----------------- c = [0 for i in range(20)] n = 0 a=d[0];b=d[1] if f(a)*diff(f,a,2)>0: c[0]=a else: c[0]=b n+=1 c[n]=c[n-1]-f(c[n-1])/diff(f,c[n-1]) while(not(abs( c[n] - c[n-1] ) < ep or abs( (c[n] - c[n-1] )/c[n])< ep or abs( f(c[n])) < ep )): n+=1 c[n]=c[n-1]-f(c[n-1])/diff(f,c[n-1]) print("n\tc[n]\t\tf(c[n])") [print("{:}\t{:<{width}}\t{:<{width}}".format(i,c[i],f(c[i]),width=15))\ for i in range(n+1)] nst = len(str(round(1/mpf(ep))))-1 #------ Print ----------------- print('\nResult ',nstr(c[n],nst))
خروجی
n c[n] f(c[n]) 0 0.5 0.3420508075688773 1 0.3202431123 0.0316568945 2 0.2999742645 0.0003498599539 3 0.2997452169 4.401896159e-8 Result 0.2997
بررسی روی نمودار
در اینجا چون در خط چهارم mpmath.dps=10 میباشد. دقت انجام محاسبات در مشتقگیری تا ۱۰ رقم بعد از اعشار خواهد بود و محدودیتی در این عدد وجود ندارد. اما دقت جواب نهایی ما به خاطر خط دوازدهم تا (۴-)^۱۰ خواهد بود.
برای مثال:
برنامهی زیر عدد نپر تا ۱۰۰۰۰۰۰ رقم اعشار را در فایل چاپ میکند.
from mpmath import * f=open("exp.txt",'w') mp.dps=1000000 f.write(str(exp(1))) f.close()
و یا کد زیر
>>> from mpmath import * >>> mp.dps = 50 >>> print mpf(2) ** mpf('0.5') 1.4142135623730950488016887242096980785696718753769 >>> print 2*pi 6.2831853071795864769252867665590057683943387987502
TypeError: unsupported format string passed to mpf.__format__