//: [Previous](@previous) // Xcode で Editor メニュー > Show Render Markup でお読みください //import UIKit import Foundation /*: # 中学3年の数学 */ /*: ## 関数 y = 𝑎𝑥² */ /*: ### 関数 y = 𝑎𝑥² のグラフ これは放物線と呼ばれる */ for a in stride(from: -3.0, through: 3.0, by: 1.0) { for x in stride(from: -5.0, through: 5.0, by: 0.1) { let y = a*x*x print(x, y) } } // 実行して、右欄の Show Result ボタンを押してみよう /*: #### 発展 関数 y = 𝑎𝑥² + 𝑏𝑥 + 𝑐 のグラフ これは放物線に y = 𝑏𝑥+𝑐 が足されたグラフで、𝑏 が正なら右肩上り、𝑏 負なら右肩下がり、 それに 𝑐 の値で上下にずらした曲線となる */ for a in stride(from: -3.0, through: 3.0, by: 1.0) { let b = 2.0, c = 3.0 for x in stride(from: -5.0, through: 5.0, by: 0.1) { let y = a*x*x + b*x + c print(x, y) } } // 実行して、右欄の Show Result ボタンを押してみよう /*: #### 2点を通る直線 2_3 を参照 */ func 2点を通る1次関数の係数(x1: Double, y1: Double, x2: Double, y2: Double) -> (a: Double, b: Double) { let a = (y2 - y1)/(x2 - x1) return ( a: a, b: y1 - x1*a ) // x = a のような傾き ∞ (無限大)の場合は (a: Double.infinity, b: Double.infinity) を返す。そのとき、a = x1 であるので注意 } /*: #### 発展 関数 𝑦 = 𝐴𝑥² + 𝐵𝑥 + 𝐶 と 𝑦 = 𝑎𝑥 + 𝑏 のグラフ この二つのグラフで、共通の 𝑥, 𝑦 の値とは、この曲線と直線との「交点」を表している まず、互いの 𝑦 が等しいので、 𝐴𝑥² + 𝐵𝑥 + 𝐶 = 𝑎𝑥 + 𝑏 𝐴𝑥² + (𝐵 - 𝑎)𝑥 + 𝐶 - 𝑏 = 0 2次方程式の解の公式より、 𝑥 = {-(𝐵 - 𝑎) ± √{(𝐵 - 𝑎)² - 4𝐴(𝐶 - 𝑏))}}/(2𝐴) これを 𝑦 = 𝑎𝑥 + 𝑏 に代入すると、 𝑦 = 𝑎{-(𝐵 - 𝑎) ± √{(𝐵 - 𝑎)² - 4𝐴(𝐶 - 𝑏))}}/(2𝐴) + 𝑏 のように、この曲線と直線との交点 (𝑥, 𝑦) が求まる */ func 2次方程式の解(a: Double, b: Double, c: Double) -> (Double, Double) { let r = sqrt(b*b - 4*a*c) return ((-b + r)/(2*a), (-b - r)/(2*a)) // 重解の場合、等しい値のペアを返す // 解なしの場合、NaN(Not a Number) のペアを返す } for (A, B, C, a, b) in [ // 例題69 (0.5, 0.0, 0.0, (8.0 - 2.0)/(4.0 - (-2.0)), 4.0), // 練習69 (0.5, 0.0, 0.0, (32.0 - 8.0)/(8.0 - (-4.0)), 2点を通る1次関数の係数(x1: -4.0, y1: 8.0, x2: 8.0, y2: 32.0).b), ] { let 解x = 2次方程式の解(a: A, b: B - a, c: C - b) let 解y = (a*解x.0 + b, a*解x.1 + b) print("\(A)𝑥² + (\(B) - \(a))𝑥 + \(C) - \(b) = 0 →", terminator: "\t") if 解x.0.isNaN { print("交点: なし") } else if 解x.0 == 解x.1 { print("交点: (\(解x.0), \(解y.0))") } else { print("交点: (\(解x.0), \(解y.0))", "(\(解x.1), \(解y.1))") let (_, b) = 2点を通る1次関数の係数(x1: 解x.0, y1: 解y.0, x2: 解x.1, y2: 解y.1) print("面積: \(fabs(解x.0*(b - C))/2 + fabs(解x.1*(b - C))/2)") } } //: [Next](@next)