python拟合曲线

发布时间 2023-12-25 23:34:54作者: 西北逍遥

 

 

import numpy as np
import matplotlib.pyplot as plt
from numpy import polynomial as P


def get_arc_curve(pts):
    '''
    获取弧度值
    :param pts:
    :return:
    '''

    # 计算弦长
    start = np.array(pts[0])
    end = np.array(pts[len(pts) - 1])
    l_arc = np.sqrt(np.sum(np.power(end - start, 2)))

    # 计算弧上的点到直线的最大距离
    # 计算公式:\frac{1}{2a}\sqrt{(a+b+c)(a+b-c)(a+c-b)(b+c-a)}
    a = l_arc
    b = np.sqrt(np.sum(np.power(pts - start, 2), axis=1))
    c = np.sqrt(np.sum(np.power(pts - end, 2), axis=1))
    dist = np.sqrt((a + b + c) * (a + b - c) * (a + c - b) * (b + c - a)) / (2 * a)
    h = dist.max()

    # 计算曲率
    r = ((a * a) / 4 + h * h) / (2 * h)

    return r


x = np.array([-80.0, -79.5, -79.0, -78.5, -78.0, -77.5, -77.0, -76.5, -76.0, -75.5, -75.0, -74.5, -74.0, -73.5, -73.0, -72.5, -72.0, -71.5, -71.0, -70.5, -70.0, -69.5, -69.0, -68.5, -68.0, -67.5, -67.0, -66.5, -66.0, -65.5, -65.0, -64.5, -64.0, -63.5, -63.0, -62.5, -62.0, -61.5, -61.0, -60.5, -60.0, -59.5, -59.0, -58.5, -58.0, -57.5, -57.0, -56.5, -56.0, -55.5, -55.0, -54.5, -54.0, -53.5, -53.0, -52.5, -52.0, -51.5, -51.0, -50.5, -50.0, -49.5, -49.0, -48.5, -48.0, -47.5, -47.0, -46.5, -46.0, -45.5, -45.0, -44.5, -44.0, -43.5, -43.0, -42.5, -42.0, -41.5, -41.0, -40.5, -40.0, -39.5, -39.0, -38.5, -38.0, -37.5, -37.0, -36.5, -36.0, -35.5, -35.0, -34.5, -34.0, -33.5, -33.0, -32.5, -32.0, -31.5, -31.0, -30.5, -30.0, -29.5, -29.0, -28.5, -28.0, -27.5, -27.0, -26.5, -26.0, -25.5, -25.0, -24.5, -24.0, -23.5, -23.0, -22.5, -22.0, -21.5, -21.0, -20.5, -20.0, -19.5, -19.0, -18.5, -18.0, -17.5, -17.0, -16.5, -16.0, -15.5, -15.0, -14.5, -14.0, -13.5, -13.0, -12.5, -12.0, -11.5, -11.0, -10.5, -10.0, -9.5, -9.0, -8.5, -8.0, -7.5, -7.0, -6.5, -6.0, -5.5, -5.0, -4.5, -4.0, -3.5, -3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0, 16.5, 17.0, 17.5, 18.0, 18.5, 19.0, 19.5, 20.0, 20.5, 21.0, 21.5, 22.0, 22.5, 23.0, 23.5, 24.0, 24.5, 25.0, 25.5, 26.0, 26.5, 27.0, 27.5, 28.0, 28.5, 29.0, 29.5, 30.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 38.5, 39.0, 39.5, 40.0, 40.5, 41.0, 41.5, 42.0, 42.5, 43.0, 43.5, 44.0, 44.5, 45.0, 45.5, 46.0, 46.5, 47.0, 47.5, 48.0, 48.5, 49.0, 49.5, 50.0, 50.5, 51.0, 51.5, 52.0, 52.5, 53.0, 53.5, 54.0, 54.5, 55.0, 55.5, 56.0, 56.5, 57.0, 57.5, 58.0, 58.5, 59.0, 59.5, 60.0, 60.5, 61.0, 61.5, 62.0, 62.5, 63.0, 63.5, 64.0, 64.5, 65.0, 65.5, 66.0, 66.5, 67.0, 67.5, 68.0, 68.5, 69.0, 69.5, 70.0, 70.5, 71.0, 71.5, 72.0, 72.5, 73.0, 73.5, 74.0, 74.5, 75.0, 75.5, 76.0, 76.5, 77.0, 77.5, 78.0, 78.5, 79.0, 79.5, 80.0])




y = np.array([86.24385437651286, 90.51267092714, 89.6286822808426, 78.83128890388481, 79.90535371948262, 76.93765247198952, 90.74226165154327, 86.06366232029734, 91.68416872530952, 83.188065890033, 84.86728072670745, 91.78981435940103, 85.91548634062782, 89.94353031300946, 99.97002648587875, 86.22704693725083, 98.72046450304853, 83.14446150178462, 96.66419340402406, 98.3022545569039, 83.3462220293988, 89.09122483730462, 93.95606471510526, 92.30878995371829, 86.64062983255775, 93.10919392747968, 98.80856342697622, 95.27432572989001, 98.77667645454275, 100.54719999231312, 90.92901046718016, 103.61814250223556, 101.61718459705642, 93.93876042230016, 93.27310984160817, 88.26357797468214, 105.10189651502033, 88.89804172567905, 98.9537934449331, 95.18454783911189, 91.5676964617668, 98.2183199850123, 103.00428370419527, 98.37470680553434, 107.1481122730001, 95.98031720864516, 96.38414142428536, 92.43695126993205, 100.24896834781457, 101.26168525347363, 111.26363182377546, 105.15541888389544, 105.95955998157703, 96.60230618669812, 111.50261989962901, 108.39558373622148, 103.7809867618132, 108.74467866703685, 106.32397704338723, 114.33135553748232, 110.6929959489503, 94.9583933809302, 104.64663608664686, 97.50112915843133, 114.55718178525971, 103.1706739270128, 115.67841746186008, 114.71134499714762, 103.78333296599509, 97.9457971916819, 106.89961421216505, 113.30127306833393, 100.13185982173701, 104.74665086169466, 109.32088891507304, 117.23980047784416, 113.23440412016757, 113.67183719082227, 106.39423192879818, 117.51035106526197, 109.52328142154323, 116.34152679923633, 107.95721980231099, 105.47683914875049, 100.4641794982094, 115.63585511949313, 113.7851375442099, 112.78075066773091, 115.15081325263941, 100.57256802407943, 119.54627868918557, 108.28094305313466, 117.10121812033088, 103.6416014563272, 101.94002991002823, 107.98380296606072, 121.23716849985962, 116.58393652858169, 105.76336019364274, 116.60885664558344, 110.35225878848382, 116.37992563873215, 118.02035750572588, 107.43552454073809, 102.61591206602452, 108.49743048350174, 107.13475663789208, 116.52151197057252, 116.47983625242308, 122.91553917579455, 119.50049722210362, 104.42189614626321, 123.12635055023038, 107.72163211463578, 103.8056486890831, 105.09518009542295, 105.03489006847057, 115.97956256182587, 121.06163511967719, 114.66426850095768, 123.62349879084493, 106.87532136693596, 121.92768486580705, 118.53646262310706, 113.26004819860171, 104.75131326359032, 108.3442911677171, 114.1307798847929, 109.4411990143004, 123.51257325090289, 111.07457710488914, 117.91280076187797, 105.45601383484403, 111.03681903346019, 117.77594851022123, 106.8115486856205, 112.88998801263757, 114.053785348688, 117.01906966281415, 108.88312288527418, 114.84446088437278, 123.91616900732589, 112.37696806345099, 113.35921445081419, 122.7827270210129, 111.91354160341128, 124.47980233408202, 120.55466325761924, 110.99927232022108, 113.97002739929977, 119.16292074389743, 108.06609752552076, 108.51171518500922, 122.35387359757034, 121.14808561294123, 121.78414510623121, 117.55712249239176, 106.3251247596372, 121.65038370057133, 118.7301432235653, 124.19077126861849, 117.51156784550817, 108.18461438888066, 118.46148093203789, 107.38954936846726, 123.9314810163504, 110.80035685158714, 109.45175798504387, 119.64523374589936, 107.22149676560294, 116.65966663209902, 107.55146491204795, 118.86669216921386, 108.0538911499259, 116.92202240626557, 113.50339424773394, 123.46304298679046, 122.84717162381551, 122.42780616626078, 120.18070353656739, 124.47398553029751, 111.77549939586173, 117.30544745959594, 105.81245531479061, 117.93109921246074, 113.76057410243583, 125.01518362438789, 111.01806921682095, 118.67570400367163, 113.00132286792932, 123.3838772641906, 112.58674468285956, 115.43801922962861, 110.995735973333, 106.13818217929278, 105.75838383981693, 110.8415538179104, 104.92878891045869, 110.57586780949883, 106.74349319825667, 105.04741224400857, 122.42886185766959, 107.28750579038098, 115.00261030442005, 106.68967206184907, 112.6670760490751, 116.14872370587835, 114.96022691281362, 108.56278842633128, 116.48395920355178, 109.54979861656352, 122.52132366940404, 121.0976493402921, 115.75818615035915, 109.43061230754058, 102.94296278706075, 111.84969656724004, 109.69399171276757, 113.00876956920423, 116.99496068859497, 108.62234557157082, 120.30816170519506, 117.54248715683927, 114.20203232803262, 112.35470322400779, 105.0550218692878, 119.20748281021976, 102.54783390683568, 107.60877810824779, 113.52060261883423, 120.02701792909939, 101.29636460219777, 104.17373850189168, 101.24307073170984, 114.44495415606612, 115.58259227538983, 116.32405216632579, 106.52967573550109, 101.56970404375927, 111.62306758549899, 106.49423326887683, 105.72644242782596, 106.14230181792132, 105.02915845520437, 113.73192764705784, 108.98214910136586, 99.2042484746407, 115.65193734956848, 109.93397249428618, 108.35176086606857, 109.1854326787869, 112.17080024453742, 114.49514828686284, 98.19216793976578, 105.19969270387105, 103.61486074258063, 98.88237962150454, 104.63837642579932, 111.99577646995576, 96.20984949233177, 100.37348939323383, 105.52842347302634, 97.38960751381822, 96.11827622661536, 100.1155450858533, 97.0231962058923, 100.2457574970624, 99.43465046106147, 95.16110432965448, 111.24553556270371, 92.42333880362644, 92.36367189459848, 111.49890932680898, 99.18497007135835, 101.85783052123712, 107.90156973469269, 109.32550105556882, 96.41016406889212, 91.20863112164088, 93.42561289284149, 103.89412139304702, 94.10765546642047, 104.37866389836071, 95.94551367453418, 94.59175788250154, 98.87363790122173, 94.94009640810962, 100.37328913430693, 98.32446066834227, 104.10904766014463, 100.40867554899582, 94.74129636672525, 88.4312075924451, 90.09816635595543, 102.15597970011648, 93.35949561524784, 99.06749643000954, 92.00685038697189, 96.19029719779547, 88.82551869609476, 84.92103038536517, 98.77634858930833, 99.862535978928, 94.74794501856275, 92.08735252928483, 97.42278918738526, 88.18790463909845, 95.61398266892374, 84.01651966025587, 84.93787106266228, 97.9538083362203, 94.85704116512561, 82.13142120942823, 79.83515267289391, 88.6899293692499, 81.66806739444252, 80.73831038181827, 82.901634338127, 81.83999263568818, 80.5894221929131, 90.31056754459215])



# 3 表示想要拟合的最高次项是多少。
p = P.polynomial.Polynomial.fit(x,y,deg=3)

# 表达式
# print(p)
# 343.18750000000006 + 59.98042929292918·x¹ - 96.68750000000027·x² + 15.80744949494958·x³


yvals = p(x) #拟合y值


xy1 = list(zip(x,yvals))
print(get_arc_curve(xy1))

plt.plot(x, y, 's',label='original values')
plt.plot(x, yvals, 'r',label='Power series')
plt.legend()
plt.show()
# 模拟一些圆的数据,这里假设你已经有了一组数据(x, y)

 

 

 

#####################