mirror of
https://github.com/heqin-zhu/algorithm.git
synced 2024-03-22 13:30:46 +08:00
110 lines
2.8 KiB
Python
110 lines
2.8 KiB
Python
''' mbinary
|
|
#########################################################################
|
|
# File : least_square.py
|
|
# Author: mbinary
|
|
# Mail: zhuheqin1@gmail.com
|
|
# Blog: https://mbinary.xyz
|
|
# 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.xyz
|
|
> 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))
|