如何解决Python中的函数近似任务?

如何解决Python中的函数近似任务?,python,algorithm,matlab,numpy,math,Python,Algorithm,Matlab,Numpy,Math,考虑[1,15]线上的复杂数学函数: f(x)=sin(x/5)*exp(x/10)+5*exp(-x/2) n次多项式(w_0+w_1 x+w_2 x^2+…+w_n x^n)由其通过的任意n+1个不同点唯一定义。 这意味着它的系数w_0。。。w_n可由以下线性方程组确定: 其中x_1,…,x_n,x_{n+1}是多项式通过的点,由f(x_1),…,f(x_n),f(x_{n+1})-它必须在这些点上取的值 我试图为三次多项式建立一个线性方程组(即,指定系数矩阵a和自由向量b),它必须与点

考虑[1,15]线上的复杂数学函数: f(x)=sin(x/5)*exp(x/10)+5*exp(-x/2)

n次多项式(w_0+w_1 x+w_2 x^2+…+w_n x^n)由其通过的任意n+1个不同点唯一定义。 这意味着它的系数w_0。。。w_n可由以下线性方程组确定:

其中x_1,…,x_n,x_{n+1}是多项式通过的点,由f(x_1),…,f(x_n),f(x_{n+1})-它必须在这些点上取的值

我试图为三次多项式建立一个线性方程组(即,指定系数矩阵a和自由向量b),它必须与点1、4、10和15处的函数f一致。使用scipy.linalg.Solve函数求解此系统

A=整数数组([1,1,1,1.],[1,4,8,64.],[1,10,100,1000.],[1,15,225,3375.]))

V=numpy.数组([3.25,1.74,2.50,0.63])

numpy.linalg.solve(A,V) 我得到了错误的答案,那就是


所以问题是:矩阵正确吗?

不,你的矩阵不正确

最大的错误是
A
的第二个子矩阵。第三个条目应该是
4**2
,这是
16
,但您有
8。
不太重要,您的常量数组
V
只有两位小数,但您确实应该有更高的精度。线性方程组有时对提供的值非常敏感,因此尽可能精确。另外,最后三个条目的四舍五入也很糟糕:你向下四舍五入,但你应该向上四舍五入。如果您真的需要两位小数(我不推荐),那么值应该是

V = numpy.array([3.25, 1.75, 2.51, 0.64])
但最好是

V = numpy.array([3.252216865271419, 1.7468459495903677,
                 2.5054164070002463, 0.6352214195786656])
通过对
A
V
的更改,我得到了结果

array([ 4.36264154, -1.29552587,  0.19333685, -0.00823565])
我得到了这两个sympy图,第一个显示原始函数,第二个使用近似三次多项式


他们看起来离我很近!当我计算1、4、10和15的函数值时,最大的绝对误差是15,即
-4.57042132584462e-6
。这比我预期的要大一些,但可能已经足够好了。

是数据科学课程的吗?:) 这是我做的一个几乎通用的解决方案:

%matplotlib inline

import numpy as np;
import math;
import matplotlib.pyplot as plt;

def f(x):
    return np.sin(x / 5) * np.exp(x / 10) + 5 * np.exp(-x / 2)

# approximate at the given points (feel free to experiment: change/add/remove)
points = np.array([1, 4, 10, 15])
n = points.size

# fill A-matrix, each row is 1 or xi^0, xi^1, xi^2, xi^3 .. xi^n
A = np.zeros((n, n))
for index in range(0, n):
    A[index] = np.power(np.full(n, points[index]), np.arange(0, n, 1))

# fill b-matrix, i.e. function value at the given points
b = f(points)

# solve to get approximation polynomial coefficents
solve = np.linalg.solve(A,b)

# define the polynome approximation of the function
def polinom(x): 
    # Yi = solve * Xi where Xi = x^i
    tiles = np.tile(x, (n, 1))
    tiles[0] = np.ones(x.size)
    for index in range(1, n):
        tiles[index] = tiles[index]**index
    return solve.dot(tiles)

# plot the graphs of original function and its approximation
x = np.linspace(1, 15, 100)
plt.plot(x, f(x))
plt.plot(x, polinom(x))

# print out the coefficients of polynome approximating our function
print(solve)

对于第1点、第4点、第10点和第15点(对不起,我不知道如何编辑命令,使其以列形式显示)w0+w1*1+w2*1^2+w3*1^3=sin(1/5)*exp(1/10)+5*exp(-1/2)w0+w1*4+w2*4^2+w3=sin(4/5)*exp(4/10)+5*exp(-4/2)w0+w1*10+w3=sin(10/5)*w0+w1*15+w2*15^2+w3*15^3=sin(15/5)*exp(15/10)+5*exp(-15/2)方程组:w0+w1*1+w2*1^2+w3*1^3=3.25W0+w1*4+w3*4^3=1.74W0+w1*10+w2*10^2+w3=2.50W0+w1*15+w2*15*15^3=0.63Roy,非常感谢!我真的很感谢你的帮助!你怎么这么快就做到了?:)@普利伍德:不客气。在您发布问题后不到一分钟,我就看到了您的问题,并且我已经安装并运行了Python副本(在Spyder中)。另外,我现在正在通过《用Python做数学》一书学习sympy,因此sympy的绘图机制在我脑海中是新鲜的。谢谢!谢谢你的帮助!如果有人知道如何改进python代码,请告诉我,我会更新答案。我不太喜欢A和polinom(x)的定义,但我没有找到更好的定义。嗨,瓦迪姆,你还记得为什么系数矩阵总是从1开始吗?比如[[1.1.1.][1.4.16.][1.15.225.]]对于在1,4,15中有x点的三级多项式?这是因为x的线性空间的第一个值是1,还是linalg.solve的某个常数?