黄金分割法
def f ( x) :
return x ** 3 - 2 * x + 1
def run ( a, b, e) :
x1 = a + 0.382 * ( b - a)
x2 = a + 0.618 * ( b - a)
while abs ( b- a) > e:
if f( a) < f( b) :
b= x2
x2= x1
x1= a + 0.382 * ( b - a)
else :
a= x1
x1= x2
x2= a + 0.618 * ( b - a)
return a, b
run( 0 , 2 , 0.002 )
(0.8160020378087369, 0.8174630366839891)
二分法
def f ( x) :
return x ** 3 - 2 * x + 1
def f1 ( x) :
return 3 * ( x ** 2 ) - 2
def run ( a, b, e) :
if f1( a) * f1( b) < 0 :
while b- a> e:
x0= 0.5 * ( a+ b)
if f1( a) * f1( x0) < 0 :
b= x0
if f1( b) * f1( x0) < 0 :
a= x0
return x0
else :
print ( '无法使用二分法' )
run( 0 , 2 , 0.004 )
0.81640625
牛顿法
from sympy import *
x = symbols( 'x' )
def f ( x) :
return x ** 4 - 4 * x ** 3 - 6 * x** 2 - 16 * x+ 4
f_d= diff( f( x) , x)
print ( '一阶导=' , f_d)
s_d= diff( f_d, x)
print ( '二阶导=' , s_d)
一阶导= 4*x**3 - 12*x**2 - 12*x - 16
二阶导= 12*x**2 - 24*x - 12
def run ( x0, e) :
while abs ( f_d. subs( { x: x0} ) ) > e:
x0= x0- ( f_d. subs( { x: x0} ) ) / ( s_d. subs( { x: x0} ) )
return str ( float ( x0) )
run( 6 , 0.01 )
'4.000046976980266'
from sympy import *
x = symbols( "x" )
f_x = x ** 4 - 4 * x ** 3 - 6 * x** 2 - 16 * x+ 4
first_grad = diff( f_x, x)
print ( "one_grad=" , first_grad)
second_grad = diff( first_grad, x)
print ( "second_grad=" , second_grad)
one_grad= 4*x**3 - 12*x**2 - 12*x - 16
second_grad= 12*x**2 - 24*x - 12
from sympy import *
x = Symbol( 'x' )
def f ( x) :
return x ** 3 - 2 * x + 1
a = diff( f( x) , x)
print ( a)
3*x**2 - 2