//: [Previous](@previous) // Xcode で Editor メニュー > Show Render Markup でお読みください //import UIKit import Foundation /*: # 中学2年の数学 */ /*: ## 1次関数 */ /*: ### 1次関数とそうではない関数 */ print("関数 𝑦 = 𝑎𝑥 + 𝑏 のグラフとそうではないグラフ") // 例題36 do { // (1) let a = 80.0, b = 200.0 print("1次関数 𝑦 = \(a)𝑥 + \(b)") for x in -50...50 { let x = Double(x) let y = a*x + b print(x, y) } } do { // (2) let a = Double.pi print("2次関数 𝑦 = \(a)𝑥²") for x in -50...50 { let x = Double(x) let y = a*x*x print(x, y) } } do { // (3) let a = 10.0 print("-1次関数 𝑦 = \(a)/𝑥") for x in -50...50 { let x = Double(x) let y = a/x print(x, y) } } do { // (4) let a = 1.0/20, b = 0.0 print("1次関数 𝑦 = \(a)𝑥 + \(b)") for x in -50...50 { let x = Double(x) let y = a*x + b print(x, y) } } // 練習36 do { // (1) let a = -60.0, b = 1000.0 print("1次関数 𝑦 = \(a)𝑥 + \(b)") for x in -50...50 { let x = Double(x) let y = a*x + b print(x, y) } } do { // (2) let a = 2.0*Double.pi, b = 0.0 print("1次関数 𝑦 = \(a)𝑥 + \(b)") for x in -50...50 { let x = Double(x) let y = a*x + b print(x, y) } } do { // (3) let a = 20.0 print("-1次関数 𝑦 = \(a)/𝑥") for x in -50...50 { let x = Double(x) let y = a/x print(x, y) } } do { // (4) let a = 1.0/30, b = 0.0 print("1次関数 𝑦 = \(a)𝑥 + \(b)") for x in -50...50 { let x = Double(x) let y = a*x + b print(x, y) } } do { // (5) let a = 10.0/20 print("-1次関数 𝑦 = a/𝑥") for x in -50...50 { let x = Double(x) let y = a/x print(x, y) } } do { // 発展 定数 let a = 4.0 print("0次関数、定数 𝑦 = a") for x in -50...50 { let y = a print(x, y) } } do { // 発展 定数 let a = 4.0 print("(𝑥 と 𝑦 を入れ替えた)0次関数、定数 𝑥 = a") for y in -50...50 { let x = a print(x, y) } } /*: #### 2点を通る直線 𝑦 = 𝑎𝑥 + 𝑏 において、(𝑥₁, 𝑦₁), (𝑥₂, 𝑦₂) を通る直線の 𝑎, 𝑏 を求める 𝑦₁ = 𝑎𝑥₁ + 𝑏 … (1) 𝑦₂ = 𝑎𝑥₂ + 𝑏 … (2) それぞれ 𝑏 を左辺に移項して、 𝑏 = 𝑦₁ - 𝑎𝑥₁ … (3) 𝑏 = 𝑦₂ - 𝑎𝑥₂ … (4) (3)=(4)より 𝑦₁ - 𝑎𝑥₁ = 𝑦₂ - 𝑎𝑥₂ 𝑎𝑥₂ - 𝑎𝑥₁ = 𝑦₂ - 𝑦₁ 𝑎(𝑥₂ - 𝑥₁) = 𝑦₂ - 𝑦₁ 𝑎 = (𝑦₂ - 𝑦₁)/(𝑥₂ - 𝑥₁) これを(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 であるので注意 } for (x1, y1, x2, y2) in [ // 例題46 (1.0, -5.0, 5.0, 3.0), (1.0, -1.0, 3.0, 9.0), // 練習46 (-3.0, 0.0, 2.0, 15.0), (-1.0, 5.0, 3.0, -5.0), (-1.0, 2.0, 1.0, 6.0), // 応用 (-1.0, 4.0, 1.0, 4.0), (4.0, -1.0, 4.0, 1.0), ] { print(2点を通る1次関数の係数(x1: x1, y1: y1, x2: x2, y2: y2)) } /*: #### 発展 𝐴𝑥 + 𝐵𝑦 = 𝐶 と 𝑦 = 𝑎𝑥 + 𝑏 の相互変換 𝐴𝑥 + 𝐵𝑦 = 𝐶 を 𝑦 の式に変形する 𝑦 = -𝐴/𝐵𝑥 + 𝐶/𝐵 つまり、𝑎 = -𝐴/𝐵, 𝑏 = 𝐶/𝐵 である また、𝑦 = 𝑎𝑥 + 𝑏 から 𝑎𝑥 - 𝑦 = -𝑏 つまり、 𝐵 = -1 とすると 𝐴 = 𝑎, 𝐶 = -𝑏 𝐵 = 1 とすると 𝐴 = -𝑎, 𝐶 = 𝑏 である。これは、𝐴𝑥 + 𝐵𝑦 = 𝐶 が冗長であることを示している */ func 1次方程式の係数変換(A: Double, B: Double, C: Double) -> (a: Double, b: Double) { return (a: -A/B, b: C/B) } func 1次方程式の係数変換(a: Double, b: Double) -> (A: Double, B: Double, C: Double) { return (A: a, B: -1, C: -b) //return (A: -a, B: 1, C: b) } print("1次方程式の係数変換") for ABC in [ (A: 2.0, B: 1.0, C: 3.0), (A: 1.0, B: -1.0, C: -1.0), (A: 3.0, B: -2.0, C: -3.0), (A: 9.0, B: -4.0, C: 16.0), ] { let ab = 1次方程式の係数変換(A: ABC.A, B: ABC.B, C: ABC.C) print(ABC, ab, 1次方程式の係数変換(a: ab.a, b: ab.b)) } /*: ### 2直線の交点の座標 関数 𝑦 = 𝑎𝑥 + 𝑏 と 𝑦 = 𝑐𝑥 + 𝑑 のグラフ この二つのグラフで、共通の 𝑥, 𝑦 の値とは、この2直線との「交点」を表している まず、互いの 𝑦 が等しいので、 𝑎𝑥 + 𝑏 = 𝑐𝑥 + 𝑑 (𝑎 - 𝑐)𝑥 = -𝑏 + 𝑑 ゆえに、 𝑥 = (-𝑏 + 𝑑)/(𝑎 - 𝑐) これを 𝑦 = 𝑎𝑥 + 𝑏 に代入すると、 𝑦 = 𝑎(-𝑏 + 𝑑)/(𝑎 - 𝑐) + 𝑏 これは連立一次方程式の解を表している */ func 連立1次方程式の解(a: Double, b: Double, c: Double, d: Double) -> (x: Double, y: Double) { let x = (-b + d)/(a - c) return (x: x, y: a*x + b) // 解なしのときは Double.infinity を返す } func 連立1次方程式の解(A: Double, B: Double, C: Double, D: Double, E: Double, F: Double) -> (x: Double, y: Double) { let ab = 1次方程式の係数変換(A: A, B: B, C: C) let cd = 1次方程式の係数変換(A: D, B: E, C: F) return 連立1次方程式の解(a: ab.a, b: ab.b, c: cd.a, d: cd.b) } for abcd in [ (a: -9.0/10, b: -2.0, c: -1.0, d: 2.0), (a: -1.0, b: 0.0, c: -2.0, d: 5.0), (a: 2.0, b: -3.0, c: 5.0, d: 2.0), ] { let 解 = 連立1次方程式の解(a: abcd.a, b: abcd.b, c: abcd.c, d: abcd.d) print("𝑦 = \(abcd.a)𝑥 + \(abcd.b) と 𝑦 = \(abcd.c)𝑥 + \(abcd.d) の交点", 解) } for ABCDEF in [ (A: 2.0, B: 1.0, C: 3.0, D: 1.0, E: -1.0, F: -1.0), (A: 3.0, B: 2.0, C: -3.0, D: 9.0, E: -4.0, F: 16.0), ] { let 解 = 連立1次方程式の解(A: ABCDEF.A, B: ABCDEF.B, C: ABCDEF.C, D: ABCDEF.D, E: ABCDEF.E, F: ABCDEF.F) print("\(ABCDEF.A)𝑥 + \(ABCDEF.B)𝑦 = \(ABCDEF.C) と \(ABCDEF.D)𝑥 + \(ABCDEF.E)𝑦 = \(ABCDEF.F) の交点", 解) } /*: #### 発展 2点を通る(上下する)反比例の曲線の係数 𝑦₁ = 𝑎/𝑥₁ + 𝑐 𝑦₂ = 𝑎/𝑥₂ + 𝑐 𝑎 + 𝑥₁𝑐 = 𝑥₁𝑦₁ 𝑎 + 𝑥₂𝑐 = 𝑥₂𝑦₂ (𝑥₁ − 𝑥₂)𝑐 = 𝑥₁𝑦₁ − 𝑥₂𝑦₂ ゆえに、 𝑐 = (𝑥₁𝑦₁ − 𝑥₂𝑦₂)/(𝑥₁ − 𝑥₂) 𝑎 = 𝑥₁𝑦₁ − 𝑥₁(𝑥₁𝑦₁ − 𝑥₂𝑦₂)/(𝑥₁ − 𝑥₂) */ func 2点を通る上下する反比例の曲線の係数(x1: Double, y1: Double, x2: Double, y2: Double) -> (a: Double, c: Double) { let c = (x1*y1 - x2*y2)/(x2 - x2) return (a: x1*y1 - x1*c, c: c) } print(2点を通る上下する反比例の曲線の係数(x1: 1.0, y1: 8.0, x2: -2.0, y2: -4.0)) print(2点を通る上下する反比例の曲線の係数(x1: 1.0, y1: 6.0, x2: 3.0, y2: 2.0)) /*: ### 直線と(平行移動した)反比例の曲線の交点の座標 関数 𝑦 = 𝑎𝑥 + 𝑏 と 𝑦 = 𝑐/(𝑥 - 𝑑) + 𝑒 のグラフ この二つのグラフで、共通の 𝑥, 𝑦 の値とは、この2直線との「交点」を表している まず、互いの 𝑦 が等しいので、 𝑎𝑥 + 𝑏 = 𝑐/(𝑥 - 𝑑) + 𝑒 両辺に ×(𝑥 - 𝑑) すると 𝑎(𝑥 - 𝑑)𝑥 + (𝑥 - 𝑑)𝑏 = 𝑐 + (𝑥 - 𝑑)𝑒 𝑎𝑥² + (𝑏 - 𝑑 - 𝑒)𝑥 - 𝑏𝑑 - 𝑐 + 𝑑𝑒 = 0 これは中学3年で習う二次方程式の解の公式で求めることができる ちなみに、反比例のグラフは 𝑑 = 0, 𝑒 = 0 である */ 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, d, e) in [ // 例題53 (4.0, 4.0, 8.0, 0.0, 0.0), // 練習53 (-2.0, 8.0, 6.0, 0.0, 0.0), ] { let 解x = 2次方程式の解(a: a, b: b - d - e, c: -b*d - c - d*e) let 解y = (a*解x.0 + b, a*解x.1 + b) print("\(a)𝑥² + (\(a)\(d) + \(b) - \(e))𝑥 + \(b)\(d) - \(c) - \(d)\(e) = 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 係数 = 2点を通る1次関数の係数(x1: 解x.0, y1: 解y.0, x2: 解x.1, y2: 解y.1) print("直線の一次方程式: 𝑦 = \(係数.a)𝑥 + \(係数.b)") } } //: [Ne𝑥t](@ne𝑥t)