您的位置:首页 > 编程语言 > Python开发

数值分析 函数逼近

2017-10-29 20:56 204 查看
通过复杂高维函数的近似替代进行计算量简化

general.py

#coding=utf-8
import sympy
from sympy import integrate
import numpy as np
import math
from matplotlib import pyplot as plt

#函数逼近的简单算法
#拟合优度的判定方法  对于数据集 dataset:{x:y}  看 R^2 相关系数
#旨在通过复杂高维函数的近似替代进行计算量简化

class appFunc:
def __init__(self,inputs,output,ranges):
self.output=output
self.input=inputs
self.range=ranges

def run(self):
#构造矩阵
x=sympy.Symbol('x')
X=[[0 for i in range(len(self.output))] for i in range(len(self.output))]
Y=[]
for i in range(len(self.output)):
for j in range(i+1):
value=float(integrate((self.output[i]*self.output[j]),(x,self.range[0],self.range[1])))
#value=1
X[i][j]=value
for i in range(len(self.output)):
for j in range(i+1):
X[j][i]=X[i][j]

for i in range(len(self.output)):
value=float(integrate((self.input*self.output[i]),(x,self.range[0],self.range[1])))
Y.append(value)

#求解矩阵
X= np.mat(X).T
Y = np.mat(Y).T

print 'X:\n',X
print 'Y:\n',Y
#A=np.mat('1 2;3 1')
#print A
#print np.linalg.inv(A)
res = np.linalg.solve(X, Y)
#tmpA = np.linalg.inv(X)
#res= np.dot(tmpA , Y)
print res
#得到表达式
self.func=0
for i in range(len(self.output)):
self.func+=res[i]*self.output[i]
print self.func

def __cal(self,func,testdata):
x=sympy.Symbol('x')
return float(func.subs(x,testdata))

def plot(self,nums):
#Ax,FuncY,appFuncY
X=[self.range[0]+1.0*i*(self.range[1]-self.range[0])/nums for i in range(nums)]
X[len(X)-1]=self.range[1]
FuncY=[self.__cal(self.input,x) for x in X]
appFuncY=[self.__cal(self.func,x) for x in X]
plt.plot(X,FuncY,label='true')
plt.plot(X,appFuncY,label='app')
plt.legend(loc='upper left')
#plt.ylim(0,1.1)
plt.savefig('appFunc.jpg')
plt.show()


test.py

#coding=utf-8
import sympy
import numpy as np
from general import appFunc

a = np.random.rand ( 10 , 10 )
b = np.random.rand ( 10 )

#from sympy import integrate
x=sympy.Symbol('x')
f1=x**3+sympy.sin(x)

f2=x**2
f3=x

f=f1*f2

def cal(func,testdata):
x=sympy.Symbol('x')
return func.subs(x,testdata)

iput=f1
out=[f2,f3]
ranges=[0,1]

app=appFunc(iput,out,ranges)
app.run()
app.plot(100)


结果如图,使用二次函数拟合了一个由三次函数和三角函数叠加的函数,大大减少了计算量。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 numpy
相关文章推荐