用Python实现内推外插法
用Python实现内推外插法
"""
Author: Z
Date: 2015-12-3
"""
import numpy as np
class node(object):
def __init__(self):
self.power = []
self.a = []
def set(self,ar,p):
for i in xrange(len(ar)):
self.a.append(ar[i])
self.power.append(p[i])
def printf(self):
print 'a[] is: ',
for i in xrange(np.array(self.a).shape[0]):
print self.a[i],
print ' '
print 'power[] is: ',
for i in xrange(np.array(self.power).shape[0]):
print self.power[i],
print ' '
############################# base function area #####################
def parse(self,string):
"""
parse str "string" into list "a" and "power"
"a" means the factor of x
"power" means the index of x
"""
self.power = []
self.a = []
string = string.replace(' ','')
eq = string.find('=')
new_string = string[(eq+1):]
index = new_string.find('x')
while(index != -1):
if new_string[index-1]=='*' and new_string[index-2].isdigit():
i = index-2
num = ""
while i>=0 and new_string[i].isdigit():
num = new_string[i] + num
i = i - 1
if i>=0 and new_string[i] == '-':
num = '-' + num
self.a.append(float(num))
else:
self.a.append(1.)
if new_string[index+1] == '^':
num = 0.
i = index + 2
while i
num = 10*num + float(new_string[i])
i = i + 1
self.power.append(num)
else:
self.power.append(1.)
index = new_string.find('x',index+1)
if new_string[-1] != 'x':
ll = len(new_string) - 1
num = ""
while ll>=0 and new_string[ll].isdigit():
num = new_string[ll] + num
ll = ll - 1
if ll >= 0 and new_string[ll] == '-':
num = '-' + num
self.a.append(float(num))
self.power.append(0.)
def get_fun_value(self,num):
ret = 0.
for i in xrange(np.array(self.a).shape[0]):
ret += self.a[i] * pow(num,self.power[i])
return ret
####################### tool function area ##############
def Min_push_forward(self,start,step):
if self.get_fun_value(star