数值分析 函数逼近

通过复杂高维函数的近似替代进行计算量简化
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)

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

结果图 误差很小

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值