파이썬 소점의 근사 곡선 2

11973 단어 Pythonpolyfit

계속하다


이 보도는 지난번 보도의 후속이다.
이번에는 두 개의 무작위 점 사이의 분할 외에도 근사 곡선을 분할해 보려고 한다.

예) 랜덤 포인트가 30개일 경우

  • 랜덤 포인트 30개, 단계 30

  • 극대 랜덤점에서는 극히 작고, 반대로도 마찬가지다.곡선의 오른쪽도 이상한 극치를 뽑았다.
  • 랜덤 포인트 30개, 단계 60

  • 나는 횟수를 배로 늘려 보았다.곡선 오른쪽의 이상한 행동은 개선되었지만 도표 중앙 부근은 개선되지 않았다.

    근사 커브 분할


    근사 곡선을 분할하기 위해 중간 무작위 점의 ndarray를 분할합니다.
    sample6.py
    import matplotlib.pyplot as plt
    import random
    import numpy as np
    import math
    
    SIZE = 30
    SEED = 2
    DEGREE = 30
    SPLIT_DISTANCE = 0.1 # 2点のランダム点の距離を0.1の長さに分割する
    SPLIT_ARRAY = 3 # 中間ランダム点の分割数
    
    def plot_split(x_val1, x_val2, y_val1, y_val2, x_medium_points, y_medium_points):
        """
        各ランダム点の中間点を生成するメソッド
        (x_val1, y_val1), (x_val2, y_val2): 2点のランダム点
        x_medium_points: 中間点のx座標をすべて格納する配列
        y_medium_points: 中間点のy座標をすべて格納する配列
        """
        # 2点のランダム点の距離を計算
        distance = math.sqrt(math.pow(x_val2 - x_val1, 2) + math.pow(y_val2 - y_val1, 2))
        # 必要な中間点の数を計算
        spl_num = math.floor(distance / SPLIT_DISTANCE)
        # 2点のランダム点を分割する. (x, y)が中間点の座標
        x_ = np.linspace(x_val1 ,x_val2, spl_num)
        y_ = np.linspace(y_val1 ,y_val2, spl_num)
        # 中間点を追加する
        x_medium_points = np.append(x_medium_points, x_)
        y_medium_points = np.append(y_medium_points, y_)
        return x_medium_points, y_medium_points
    
    
    def plot_split_curve(x_medium_points, y_medium_points, DEGREE, n):
        """
        分割した中間ランダム点を描画するメソッド
        """
        coeff = np.polyfit(x_medium_points, y_medium_points, DEGREE)
        y_polyfit = np.poly1d(coeff)(x_medium_points)
    
        plt.plot(x_medium_points, y_medium_points, marker='o')
        if n == 0:
            plt.plot(x_medium_points, y_polyfit, label='approximate curve', color='red')
        else:
            plt.plot(x_medium_points, y_polyfit, color='red')
    
    
    def plot_curve():
        """
        近似曲線を描画するメソッド
        """
        np.random.seed(seed=SEED)
        plt.figure(figsize=(8.0, 6.0))
    
        x = np.array(range(SIZE))
        y = np.random.rand(SIZE)
        x_medium_points = np.empty(0) # すべての中間点のx座標を格納するndarray
        y_medium_points = np.empty(0) # すべての中間点のy座標を格納するndarray
        # すべてのランダム点間を分割するループ
        for i in range(SIZE - 1):
            x_medium_points, y_medium_points = plot_split(
                x[i], x[i + 1], y[i], y[i + 1], x_medium_points, y_medium_points
            )
        # ndarrayの分割
        for n, x_split_array, y_split_array in zip(
            range(SPLIT_ARRAY),
            np.array_split(x_medium_points, SPLIT_ARRAY),
            np.array_split(y_medium_points, SPLIT_ARRAY)
        ):
            plot_split_curve(x_split_array, y_split_array, DEGREE, n)
        plt.legend()
        plt.show()
    
    plot_curve()
    
  • 랜덤점 30개, 단계 30, 중간 랜덤점 분할수 3
  • 랜덤점 30개, 단계 30, 중간 랜덤점 분할수 6

  • 참고문

    좋은 웹페이지 즐겨찾기