数值分析 函数逼近
2017-10-29 20:56
204 查看
通过复杂高维函数的近似替代进行计算量简化
general.py
test.py
结果如图,使用二次函数拟合了一个由三次函数和三角函数叠加的函数,大大减少了计算量。
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)
结果如图,使用二次函数拟合了一个由三次函数和三角函数叠加的函数,大大减少了计算量。
相关文章推荐
- 数值分析-Legendre正交多项式 实现函数逼近
- Oracle分析函数总结(3)- 数值分布 - cume_dist,percent_rank,ntile,percentile_disc,percentile_cont,ratio_to_report
- 99、插值法,函数逼近,曲线拟和,数值积分,数值微分,解线性方程组的直接方法,解线性方程组的迭代法,非线性方程求根,常微分方程的数值解法
- Oracle分析函数总结(3)- 数值分布 - cume_dist,percent_rank,ntile,percentile_disc,percentile_cont,ratio_to_report
- 数值分析 第五章 插值与逼近
- 数值分析读书笔记(5)数值逼近问题(I)----插值极其数值计算
- Oracle分析函数总结(3)- 数值分布 - cume_dist,percent_rank,ntile,percentile_disc,percentile_cont,ratio_to_report
- 数值分析入门——三角函数的多项式逼近
- 数值分析(拟合、插值和逼近)之数据插值方法(线性插值、二次插值、Cubic插值、埃米尔特、拉格朗日多项式插值、牛顿插值、样条插值)(含opengl程序)
- MFC中UpdateData( bool b)函数的用法---控件变量与数值
- (others)Linux内核ARP发送函数分析
- oracle——分析函数OVER ()
- oracle 分析函数之 rank(), dense_rank(), lag(), lead()
- C++中的虚函数分析(1)
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
- 源码分析:静态分析 C 程序函数调用关系图
- javascript 表达式、括号、常用函数和jquery库怎么样实现的分析
- oracle常用分析函数
- 浅谈SQLite时间函数的使用说明与总结分析
- 浅谈oracle中row_number() over()分析函数用法