파이썬 소점의 근사 곡선 2
계속하다
이 보도는 지난번 보도의 후속이다.
이번에는 두 개의 무작위 점 사이의 분할 외에도 근사 곡선을 분할해 보려고 한다.
예) 랜덤 포인트가 30개일 경우
극대 랜덤점에서는 극히 작고, 반대로도 마찬가지다.곡선의 오른쪽도 이상한 극치를 뽑았다.
나는 횟수를 배로 늘려 보았다.곡선 오른쪽의 이상한 행동은 개선되었지만 도표 중앙 부근은 개선되지 않았다.
근사 커브 분할
근사 곡선을 분할하기 위해 중간 무작위 점의 ndarray를 분할합니다.
sample6.pyimport 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()
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()
참고문
Reference
이 문제에 관하여(파이썬 소점의 근사 곡선 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/quryu/items/88e768a6bef5e06e4179
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(파이썬 소점의 근사 곡선 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/quryu/items/88e768a6bef5e06e4179텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)