mirror of
https://github.com/heqin-zhu/algorithm.git
synced 2024-03-22 13:30:46 +08:00
105 lines
2.8 KiB
Python
105 lines
2.8 KiB
Python
''' mbinary
|
|
#########################################################################
|
|
# File : least_square.py
|
|
# Author: mbinary
|
|
# Mail: zhuheqin1@gmail.com
|
|
# Blog: https://mbinary.coding.me
|
|
# Github: https://github.com/mbinary
|
|
# Created Time: 2018-10-02 21:14
|
|
# Description:
|
|
#########################################################################
|
|
'''
|
|
|
|
'''*************************************************************************
|
|
> File Name: least-square.py
|
|
> Author: mbinary
|
|
> Mail: zhuheqin1@gmail.com
|
|
> Created Time: Sat 07 Apr 2018 09:55:25 PM DST
|
|
> Blog: https://mbinary.github.io
|
|
> Description: 最小二乘法解线性方程组, 解矛盾方程组
|
|
************************************************************************'''
|
|
|
|
|
|
import re
|
|
import numpy as np
|
|
|
|
|
|
|
|
def solveConflitEqualtion(A,y):
|
|
'''solve equation like this: Av = y,
|
|
A:m*n v:n*1 y:m*1
|
|
return vector v
|
|
'''
|
|
A = np.matrix(A)
|
|
y = np.array(y)
|
|
ata = A.T*A
|
|
print('AtA')
|
|
print(ata)
|
|
return np.linalg.solve(ata,A.T*y) # note that is numpy.linalg.solve
|
|
|
|
def solveLinear(point,index):
|
|
y = [[i[1]] for i in point]
|
|
x = [[i[0]] for i in point]
|
|
A = []
|
|
for i in x:
|
|
A.append([i[0]**j for j in index])
|
|
res = solveConflitEqualtion(A,y)
|
|
print('the solution is : \n',res)
|
|
print('namely: ')
|
|
items = ['{:.4f}x^{}'.format(res[i,0],j) for i, j in enumerate(index)]
|
|
print('phi(x) = ',' + '.join(items))
|
|
|
|
def handleInput(s=None,y=None):
|
|
# numPt = re.compile (r'\d*\.{0,1}\d+')
|
|
if not s: s = input('input matrix A:m*n //m>=n\n')
|
|
s = s.replace(' ','')
|
|
li = re.findall(r'(\[(\d+)(,(\d+))+\])',s)
|
|
li = [parseLst(i[0]) for i in li]
|
|
if not y:y = input('input a vector y:n*1\n')
|
|
y = parseLst(y)
|
|
print('Equation: Av = y:')
|
|
|
|
print('y is as follows: ')
|
|
print(y)
|
|
print('A is as follows: ')
|
|
for i in li:
|
|
for j in i:
|
|
print('{}'.format(j).rjust(5),end='')
|
|
print('')
|
|
|
|
print('result v is as follows: ')
|
|
res = solveConflitEqualtion(li,y)
|
|
print(res)
|
|
def parseLst(s):
|
|
s = s.strip('[]')
|
|
li = s.split(',')
|
|
li = [float(j) for j in li]
|
|
return li
|
|
|
|
|
|
if __name__ == '__main__':
|
|
'''
|
|
li = '[[23,2],[2,5],[2,6]]'
|
|
y = '[1,3]'
|
|
while True:
|
|
handleInput(li,y)
|
|
s = input('input y to continue, n for exit')
|
|
if s!='y':break
|
|
'''
|
|
point = [(-3,14.3),(-2,8.3),(-1,4.7),(2,-8.3),(4,-22.7)]
|
|
lst = [0,3]
|
|
solveLinear(point,lst)
|
|
|
|
point= [(-3,14.3),(-2,8.3),(-1,4.7),(2,8.3),(4,22.7)]
|
|
lst = [0,2]
|
|
solveLinear(point,lst)
|
|
|
|
A = [[1,2],[2,1],[1,1]]
|
|
y = [[5],[6],[4]]
|
|
res = solveConflitEqualtion(A,y)
|
|
|
|
print(res)
|
|
A = [[1,-2],[1,5],[2,1],[1,1]]
|
|
y = [[1],[13.1],[7.9],[5.1]]
|
|
print(solveConflitEqualtion(A,y))
|