# 直線方程式與向量
## 直線方程式
### **國中 :**
已知通過 **(X~1~,Y~1~) , (X~1~,Y~1~)**
設兩點通過 **Y=aX+b** ,其中 **a,b**為未知數
接者解聯立方程式,求出直線方程式
### **高一 :**
已知 **斜率** 概念,透過 :
點斜式 : **Y-Y~0~ = m(X-X~0~)**
截距式 : **X/a+Y/b=1**
兩點式 : **X-X~1~/X~2~-X~1~ = Y-Y~1~/Y~2~-Y~1~**
求出直線方程式
### **高二 :**
已知 **向量** 概念 :
透過==參數式==表示直線
### 參數式推導&範例
直線 **L** 方向向量 **{V|⇀}(13,17)** 過點 **A(-3,-4)**
設**P(x,y)**為**L**上任意點
⇔ **{AP|⇀}**//**{V|⇀}**
⇔ **{AP|⇀}**//**t{V|⇀}**, **t**為實數
⇔ **{OP|⇀} − {OA|⇀}** = **t{V|⇀}** ,**t**為實數 (O為原點)
⇔ **{OP|⇀} = {OA|⇀}** + **t{V|⇀}** ,**t**為實數
**P(x,y) = A(-3,-4) + t(13,17)**
直線 **L** 的方向向量 **{V|⇀}=(a,b)**,**L**過點**P(x~0~,y~0~)**
**L**的**直線參數式** : (**t**為參數)
**x=x~0~+at**
**y=y~0~+bt**
## 克拉瑪公式
### 推導
**二元一次方程組 :** (其中 **X** , **Y** 為未知數)
**a~1~X+b~1~Y=c~1~** ... **(1)**
**a~2~X+b~2~Y=c~2~** ... **(2)**
利用**加減消去法** :
**(1)** × **b~2~** - **(2)** × **b~1~** ⇒ **(a~1~b~2~−a~2~b~1~)X** = **(c~1~b~2~−c~2~b~1~)**
**(1)** × **a~2~** - **(2)** × **a~1~** ⇒ **(a~2~b~1~−a~1~b~2~)y** = **(c~1~a~2~−c~2~a~1~)**
可得 :
**∆ ⋅ X**= ==**∆~x~**==
**∆ ⋅ Y**= ==**∆~y~**==
| ∆ | ∆~x~ | ∆~y~ |
| -------- | -------- | -------- |
| \ ^a1^~a2~ ^b1^~b2~ \ | \ ^c1^~c2~ ^b1^~b2~ \ | \ ^a1^~a2~ ^c1^~c2~ \ |
| a~1~b~2~ - a~2~b~1~ | c~1~b~2~ - c~2~b~1~ | a~1~c~2~ - a~2~c~1~ |
### 是否有解
* 當 **∆ ≠ 0** 時 :
方程組**恰有一組解** : ( X,Y ) = ( **∆~x~/∆** , **∆~y~/∆** )
* 當 **∆ = ∆~x~ = ∆~y~ = 0** 時 :
方程組**無限多組解**
* 當 **∆ = 0 且 ∆~x~^2^ + ∆~y~^2^ ≠ 0** 時 :
方程組**無解**
### 轉為程式碼
[Run my code online](https://repl.it/@jason810496/Cramers-rule#main.cpp)
```c
#include <bits/stdc++.h>
using namespace std;
int a1,b1,c1,a2,b2,c2,delta,delta_x,delta_y;
void ans_x(){
int dx=delta_x,d=delta;
if(d<0&&dx<0) d=abs(d),dx=abs(dx);
else if(d<0&&dx>0) d=-d,dx=-dx;
int temp=gcd(d,dx);
d/=temp,dx/=temp;
cout<<"X: ";
if(d==1&&dx==1) cout<<"1\n";
else if(dx==0) cout<<"0\n";
else{
cout<<dx<<"/"<<d<<'\n';
}
}
void ans_y(){
int dy=delta_y,d=delta;
if(d<0&&dy<0) d=abs(d),dy=abs(dy);
else if(d<0&&dy>0) d=-d,dy=-dy;
int temp=gcd(d,dy);
d/=temp,dy/=temp;
cout<<"Y: ";
if(d==1&&dy==1) cout<<"1\n";
else if(dy==0) cout<<"0\n";
else{
cout<<dy<<"/"<<d<<'\n';
}
}
void input(){
char none;
string s1,s2,no;
stringstream ss;
cout<<"Input system of linear equations :\nin the form of : (a1,b1...need to be Integer)\na1X+b1Y=c1\na2X+b2Y=c2\n\n";
getline(cin,s1),getline(cin,s2);
ss.str(s1);
ss>>a1>>none>>none>>b1>>none>>none>>c1;
ss.clear();
ss.str(s2);
ss>>a2>>none>>none>>b2>>none>>none>>c2;
ss.clear();
}
void process_data(){
delta= a1*b2-a2*b1;
//cout<<delta<<'\n';
delta_x= c1*b2-c2*b1;
//cout<<delta_x<<'\n';
delta_y= a1*c2-a2*c1;
//cout<<delta_y<<'\n';
}
void check(){
if(delta!=0){
cout<<"The system has a single unique solution.\n";
ans_x();
ans_y();
}
else{
if(delta_x!=0||delta_y!=0){
cout<<"The system has no solution.\n";
}
else{
cout<<"The system has infinitely many solutions.\n";
}
}
}
int main(){
input();
process_data();
check();
return 0;
}
```