Python计算&绘图——曲线拟合问题

        题目来自老师的课后作业,如下所示。很多地方应该可以直接调用函数,但是初学Python,对里面的函数还不是很了解,顺便带着学习的态度,尽量自己动手code。

         Python计算&绘图——曲线拟合问题_第1张图片


测试版代码,里面带有很多注释和测试代码:

# -*- coding: cp936 -*-
import math
import random
import matplotlib.pyplot as plt
import numpy as np


'''
在x=[0,1]上均匀采样10个点组成一个数据集D=[a,b]
'''
a = []
b = []
x=0
def func(x):
    mu=0
    sigma=0.1
    epsilon = random.gauss(mu,sigma) #高斯分布随机数
    return np.sin(2*np.pi*x)+epsilon
for i in range(0,10):
    x=x+1.0/11.0
    a.append(x)
    b.append(func(x))




#定义输出矩阵函数
def print_matrix( info, m ): 
    i = 0; j = 0; l = len(m)
    print info
    for i in range( 0, len( m ) ):
        for j in range( 0, len( m[i] ) ):
            if( j == l ):
                print ' |',
            print '%6.4f' % m[i][j],
        print
    print


#定义交换变量函数
def swap( a, b ):
    t = a; a = b; b = t
    
#定义线性方程函数,高斯消元法    
def solve( ma, b, n ):
    global m; m = ma # 这里主要是方便最后矩阵的显示
    global s;    
    i = 0; j = 0; row_pos = 0; col_pos = 0; ik = 0; jk = 0
    mik = 0.0; temp = 0.0  
    n = len( m )
# row_pos 变量标记行循环, col_pos 变量标记列循环
    while( ( row_pos < n ) and( col_pos < n ) ):
        # 选主元
        mik = - 1
        for i in range( row_pos, n ):
            if( abs( m[i][col_pos] ) > mik ):
                mik = abs( m[i][col_pos] )
                ik = i
        if( mik == 0.0 ):
            col_pos = col_pos + 1
            continue
        # 交换两行
        if( ik != row_pos ):
            for j in range( col_pos, n ):
                swap( m[row_pos][j], m[ik][j] )
                swap( m[row_pos][n], m[ik][n] );  
        try:
            # 消元
            m[row_pos][n] /= m[row_pos][col_pos]
        except ZeroDivisionError:
            # 除零异常 一般在无解或无穷多解的情况下出现……
            return 0;     
        j = n - 1
        while( j >= col_pos ):
            m[row_pos][j] /= m[row_pos][col_pos]
            j = j - 1
        for i in range( 0, n ):
            if( i == row_pos ):
                continue
            m[i][n] -= m[row_pos][n] * m[i][col_pos]
            j = n - 1
            while( j >= col_pos ):
                m[i][j] -= m[row_pos][j] * m[i][col_pos]
                j = j - 1
        row_pos = row_pos + 1; col_pos = col_pos + 1
    for i in range( row_pos, n ):
        if( abs( m[i][n] ) == 0.0 ):
            return 0
    return 1




matrix_A=[]         #将系数矩阵A的所有元素存到a[n-1][n-1]中
matrix_b=[]
X=a
Y=b
N=len(X)
M=3    #对于题目中要求的不同M[0,1,3,9]值,需要在这里更改,然后重新编译运行


#计算线性方程组矩阵A的第[i][j]个元素A[i][j]    
def matrix_element_A(x,i,j,n): 
    sum_a=0
    for k in range(0,n):   
        sum_a = sum_a+pow(x[k],i+j-2)   #x[0]到x[n-1],共n个元素求和
    return sum_a


for i in range(0,M+1):  
    matrix_A.append([])  
    for j in range(0,M+1):  
        matrix_A[i].append(0)
        matrix_A[i][j] = matrix_element_A(X,i+1,j+1,N)
#计算线性方程组矩阵b的第[i]行元素b[i]
def matrix_element_b(x,y,i,n): 
    sum_b=0
    for k in range(0,n):
        sum_b=sum_b+y[k]*pow(x[k],i-1)  #x[0]到x[n-1],共n个元素求和
    return sum_b
for i in range(0,M+1):
    matrix_b.append(matrix_element_b(X,Y,i+1,N))


#函数matrix_element_A_()用来求扩展矩阵A_,array_A表示系数矩阵A,array_b表示方程组右侧常数,A_row表示A的行秩
def matrix_element_A_(array_A,array_b,A_row):
    M=A_row  #局部变量M,与全局变量M无关
    matrix_A_= []
    for i in range(0,M+1):
        matrix_A_.append([])
        for j in range(0,M+2):
            matrix_A_[i].append(0)
            if j

M=3时的运行结果:

3阶泰勒级数展开式的系数为:
[6.283185307179586, -41.341702240399755]
M=3时的系数w[j]:
[-0.28492708632293295, 13.031310645420685, -37.730992850050448, 25.464782221275197]
三阶泰勒展开式的测试误差为:100.889335
M=3时多项式拟合函数的训练误差为:0.008933
M=3时多项式拟合函数的测试误差为:0.007886


Figure(1):

Python计算&绘图——曲线拟合问题_第2张图片

Figure(2):

Python计算&绘图——曲线拟合问题_第3张图片


         初次编写这么长的代码,思路不是有一点的混乱。其中有也有。以后会继续来优化这个程序,作为学习Python的入口。




        

你可能感兴趣的:(Pyhon绘图,Pyhon计算)