Labs

<< 最初 < 前ページ 次ページ > 最後 >>
icon [Sympy]3次関数をグラフ化(Sympy編) (2018/12/03)
matplotlib の plot() はデータをプロットするが、Sympy の plot() を利用すると一般式をグラフ化できる。
数式を手っ取り早く視覚化するには使える

y = ax3+bx2+cx + d
Sympy 3次関数グラフSympy の plot() の第1引数に数式、第2引数にX軸の情報を入れる

サンプル

from sympy.plotting import plot
from sympy import Number, NumberSymbol, Symbol, Eq, solve
import sys
 
def function():
    x = Symbol('x')
    return a*x**3 + b*x**2 + c*x + d

a, b, c, d = map(float, input('Please input a, b, c, d.\n').split())
min_x, max_x = map(float, input('Please input min x, max x.\n').split())
if (min_x >= max_x): sys.exit('invalid min x max x!')
 
x = Symbol('x')
y = function()

min_y = y.subs([(x, min_x)]) 
max_y = y.subs([(x, max_x)])

plot(y, (x, min_x, max_x))
ちなみに、以下でxの最大最小から、yの最大最小を求めている。
min_y = y.subs([(x, min_x)]) 
max_y = y.subs([(x, max_x)])
icon 2次関数のグラフと解を強引にグラフ化 (2018/12/02)
2次関数の解はSympy.solve, scipy.optimize.fsolve を使っても求められるが、ここでは非効率だが2次関数の一般式を作成、解を求めてグラフ化してみる。
二次関数 解の公式

2次関数の定数を標準入力

a, b, c = map(float, input('Please input a, b, c\n').split())
*Python3 の記述

解の公式

y =ax2+bx + c
x=-b±b2-4ac2a
def answer(a, b, c):
    x1 = (-b + np.sqrt((b ** 2) - (4 * a * c))) / (2 * a)
    x2 = (-b - np.sqrt((b ** 2) - (4 * a * c))) / (2 * a)
    return [x1, x2]

判別式

解がない(虚数)だと、プロットできないので判別式の関数を作成
((b**2) - (4 * a * c)) >= 0

X座標の配列

最大値、最小値、X軸プロット間隔を設定
def plotX(a, b, c):
    max_x = 10
    min_x = -10
    x = np.arange(min_x, max_x, 0.1)
    return x
*最終的に最大値、最小値は、解によって動的に変化させる

Y座標の配列

二次方程式を記述
def plotY(a, b, c):
    return a*x**2 + b*x + c

サンプル

import matplotlib.pyplot as plt
import numpy as np
from sympy import *

def hasAnswer(a, b, c):
    return ((b * b) - (4 * a * c)) >= 0

def answer(a, b, c):
    x1 = (-b + sqrt((b ** 2) - (4 * a * c))) / (2 * a)
    x2 = (-b - sqrt((b ** 2) - (4 * a * c))) / (2 * a)
    return [x1, x2]

def plotX(a, b, c):
    max_x = 10
    min_x = -10

    if (hasAnswer(a, b, c)):
        x = answer(a, b, c)
        x1 = x[0]
        x2 = x[1]
        center = (x2 - x1) * 0.5

        band = abs(x2 - x1)
        if band <= 1:
            band = 10

        max_x = round(x1 + band, 0)
        min_x = round(x2 - band, 0)

    x = np.arange(min_x, max_x, 0.1)
    return x

def plotY(a, b, c):
    return a*x**2 + b*x + c

def plotScatterX(plt, a, b, c):
    if (hasAnswer(a, b, c)):
        x = answer(a, b, c)
        plt.scatter([x[0]], [0], label = 'x1 = %s' % x[0])
        plt.scatter([x[1]], [0], label = 'x2 = %s' % x[1])
    return

print('Simulatenous Equations. a * x^2 + b * x + c')
a, b, c = map(float, input('Please input a, b, c\n').split())

x = plotX(a, b, c)
y = plotY(a, b, c)
plt.plot(x, y)

plotScatterX(plt, a, b, c)

plt.title('Function: %sx^2 + %sx + %s' % (a, b, c))

plt.grid(color='gray')
plt.legend()
plt.show()
icon 各時間毎の累積データ (2018/07/19)
SQLで累積を計算する場合、OVER句を利用すると便利

1ヶ月の降水量を各時間ごとに累積

データ

1時間毎の雨量を INSERT
datetime, precipitation
2018-06-01 00:00, 0.0
2018-06-01 01:00, 0.1
2018-06-01 02:00, 0.3
.......
2018-06-30 22:00 1.2
2018-06-30 23:00 1.3

SQL

datetime を昇順でソートし、降水量累計
SELECT datetime, precipitation,
              SUM(precipitation) OVER(ORDER BY datetime ASC) AS sum_precipitation
FROM rainfalls
WHERE  datetime >= '2018-06-01 00:00' AND datetime < '2018-07-01 00:00'
ORDER BY datetime

計算後

datetime, precipitation, sum_precipitation
2018-06-01 00:00, 0.0, 0.0
2018-06-01 01:00, 0.1, 0.1
2018-06-01 02:00, 0.3, 0.4
.......
2018-06-30 22:00 1.2, 11.1
2018-06-30 23:00 1.3, 12.4
<< 最初 < 前ページ 次ページ > 最後 >>