- TI nspire
[TI-nspire] (프로그램) 보간법 (선형, 다항식) Linear & Polynomial Interpolation
Linear & Polynomial Interpolation for TI-Nspire
Ver 1.2
by allcalc.org
-----
Usage
1. Input each x1,y1,x2,y2... var_x and var_y alternately
or matrix (2*n) type DATA at prompt for DATA.x
2. When you finished to insert DATA, type "end" at prompt for DATA.x
3. If there's no error with DATA sets, function i.linear() and i.polynomial() will be created.
4. Use functions to find unkown value "y"
5. Additionally, data.sub(matrix) and data.subx,data.suby(list) will be made too.
Caution
To stop a program that contains a Request command inside an infinite loop:
• Handheld: Hold down the "on" key and press "enter" repeatedly.
• Windows?: Hold down the "F12" key and press "Enter" repeatedly.
• Macintosh?: Hold down the "F5" key and press "Enter" repeatedly.
1. 기능
기본 데이터를 입력하여 선형 보간법에 따른 조각함수(Piecewise Function) i.linear(x) 와 다항식 보간법(라그랑주)에 따른 함수 i.polynomial(x) 를 생성합니다.
생성된 함수를 이용하여 특정 값(x)에서의, 보간법 예상치(y)를 구합니다.
2. 사용법
2-a. 기본 데이터 입력
- 프로그램의 실행 : inter()
- 기본 DATA 입력
방법 1 : 번갈아 입력 : x1, y1, x2, y2, x3, y3... , (입력이 끝나면 e 또는 end 를 입력)
혹은
방법 2 : 2×N 행렬을 한꺼번에 입력 : x값 입력시에 입력 - DATA 입력시
주의사항
* x 는 크기 순서로 입력할 필요 없음 (자동 sort 됨)
* (x,y) 데이터 쌍이 중복 되어도 괜찮으나, 하나의 x값에 둘 이상의 y값이 존재하면 에러 발생
2-b. 결과 함수의 이용
- 2-a의 입력이 끝나면 결과함수로 사용할 변수명을 물어봄
- 결과함수를 이용하여 추정값을 구함
ex) i.linear(3) 【Enter】 : x=3일 때의 추정값을 구함
2-c. 생성된 함수의 확인 http://www.allcalc.org/5752
- 【MENU】 【1】 【2】 (Action - Recall Definition) 명령으로 사용자 함수에 현재 정의되어 있는 내용을 확인할 수 있습니다.
3. 결과


4. 소스코드
Define LibPub inter()=
Prgm
:© Linear and Polynomial Interpolation for TI-nspire
:© Ver 1.2
:© by allcalc (allcalc.org)
:
:© Part A: Input DATA
:
:Local n,data.x,data.y,data
:n:=0
:Loop
: Request "data.x or matrix(2×n) or END",data.x,0
:
:© Exit Loop Condition
: If string(data.x)="end" or string(data.x)="END" or string(data.x)="e" Then
: Exit
: EndIf
:
:© Adding Data
: n+1→n
:© Adding Data with Matrix
: If getType(data.x)="MAT" Then
: n+dim(data.x)[2]-1→n
: If n=dim(data.x)[2] Then
: data.x→data
: Else
: augment(data,data.x)→data
: EndIf
:© Adding Each Data Pair
: Else
: Request "data.y for x="&string(data.x),data.y,0
: If string(data.y)="end" or string(data.y)="END" Then
: Exit
: EndIf
: If n=1 Then
:[[data.x][data.y]]→data
: Else
: augment(data,[[data.x][data.y]])→data
: EndIf
: EndIf
:EndLoop
:
:© Part B : Data Processing
:
:© Part B1 : Data Processing
:Local data.listx,data.listy
:mat▶list(data[1])→data.listx
:mat▶list(data[2])→data.listy
:SortA data.listx,data.listy
:colAugment(list▶mat(data.listx),list▶mat(data.listy))→data
:
:© Part B2 : Section Verification&Consolidation and Slope
:© Verification
:Local i,j,dup
:newList(n)→dup
:For i,1,n-1
: If data[1,i]=data[1,i+1] Then
: 1→dup[i+1]
: If data[2,i]≠data[2,i+1] Then
: Disp "Data Error : ",[["x"]["y"]],"=",subMat(data,1,i,2,i+1)
: Stop
: EndIf
: EndIf
:EndFor
:
:© Consolidation
:© Local data.sub : Make data.sub global var
:subMat(data,1,1,2,1)→data.sub
:For i,2,n
: If dup[i]=0 Then
: augment(data.sub,subMat(data,1,i,2,i))→data.sub
: EndIf
:EndFor
:
:mat▶list(data.sub[1])→data.subx
:mat▶list(data.sub[2])→data.suby
:Disp "data.sub",[["x"]["y"]],"=",data.sub
:
:© Slope for Linear Interpolation
:Local sub.slope,sub.n
:dim(data.sub)[2]→sub.n
:newList(sub.n-1)→sub.slope
:For i,1,sub.n-1
:((data.sub[2,i+1]-data.sub[2,i])/(data.sub[1,i+1]-data.sub[1,i]))→sub.slope[i]
:EndFor
:
:
:© Part C1 : Out Polynomial Function as i.polynomial(x)
:Local poly,f_name
:"i"→f_name
:Request "Input Function name",f_name,0
:If getType(f_name)="NUM" Then
:"i"&string(f_name)→f_name
:Else
: If getType(f_name)≠"STR" Then
: string(f_name)→f_name
: EndIf
:EndIf
:
:"Define "&f_name&".polynomial(var_x)="&string(∑(data.sub[2,i]*∏(when(i≠j,((var_x-data.sub[1,j])/(data.sub[1,i]-data.sub[1,j])),1),j,1,sub.n),i,1,sub.n))→poly
:expr(poly)
:
:© Part C2 : Out Piecewise Linear Interpolation Function as i.linear(x)
:
:Local pf,random.x
:"Define "&f_name&".linear(x)=piecewise("→pf
:For i,1,sub.n-1
: pf&string(sub.slope[i]*(x-data.sub[1,i])+data.sub[2,i])&","&string(data.sub[1,i]≤x≤data.sub[1,i+1])&","→pf
:EndFor
:left(pf,dim(pf)-1)&")"→pf
:expr(pf)
:
:© Part C3 : Display functions usage
:rand()*(data.sub[1,sub.n]-data.sub[1,1])+data.sub[1,1]→random.x
:Disp "Usage : "&f_name&".linear("&string(random.x)&")=",#(f_name&".linear")(random.x)
:Disp f_name&".polynomial("&string(random.x)&")=",#(f_name&".polynomial")(random.x)
:
:Disp "Linear function is =",pf
:Disp "Polynomial function is =",poly
:EndPrgm
댓글10
-
세상의모든계산기
이 프로그램은 선형 보간법과 라그랑주 보간법을 동시에 구하는 프로그램입니다.
간단하게 선형 보간법의 결과만 필요한 경우에는
별도의 프로그램 파일 혹은 라이브러리를 사용하기보다 statistics(통계) 의 Linear Regression 기능을 이용하는 것이 편합니다.(예제 : http://www.allcalc.org/7826 )
- 1
-
세상의모든계산기
예를 들어
http://www.allcalc.org/2387 의 댓글에 있는 예제를 푼다면
【inter()】
【200】【1250】
【300】【1890】
【e】【Enter】
순으로 DATA 입력을 마치고【i.linear(250)】
으로 목표값을 찾습니다.* 이렇게 DATA 가 2쌍 뿐인 경우에는 i.linear() 함수와 i.polynomial() 함수가 동일한 결과값을 출력합니다.
(단, linear() 함수는 조각함수라서 데이터 범위 안쪽의 값만을 구할 수 있습니다.) - 1
- 2
- 3
- 4
-
3
세상의모든계산기
inter() 함수 결과에 생성된 함수를 출력하는 명령(Disp)을 추가했습니다.
한 줄 표기되어서 알아보기 어렵다고 느끼실 때는
- Menu - Action - Recall Definition
- 아니면 한 줄 표기된 결과를 선택해서 입력창에 붙여넣기 하신 다음 [enter] 하시면 입체적 표현으로 바뀝니다.

세상의모든계산기 님의 최근 댓글
답에 이상한 숫자 14.2857142857가 들어간 것은 조건식에 소숫점(.) 이 들어가 있기 때문에 발생한 현상이구요. 100÷7 = 14.285714285714285714285714285714 소숫점 없이 분수로 식이 주어졌을 때와 결과적으로는 동일합니다. 2025 12.30 그럼 해가 무한히 많은지 아닌지 어떻게 아느냐? 고등학교 수학 교과과정에 나오는 행렬의 판별식(d, determinant)을 이용하면 알 수 있습니다. 연립방정식의 계수들로 행렬을 만들고 그 행렬식(determinant)을 계산하여야 합니다. 행렬식이 d≠0 이면 유일한 해가 존재하고, d=0 이면 해가 없거나 무수히 많습니다. * 정상적인 경우 (`2y + 8z = 115`)의 계수 행렬: 1 | 1 1 0 | 2 | 1 0 -3.5 | 3 | 0 2 8 | 행렬식 값 = 1(0 - (-7)) - 1(8 - 0) = 7 - 8 = -1 (0이 아니므로 유일한 해 존재) * 문제가 된 경우 (`2y + 7z = 100`)의 계수 행렬: 1 | 1 1 0 | 2 | 1 0 -3.5 | 3 | 0 2 7 | 행렬식 값 = 1(0 - (-7)) - 1(7 - 0) = 7 - 7 = 0 (0이므로 유일한 해가 존재하지 않음) 2025 12.30 좀 더 수학적으로 말씀드리면 (AI Gemini 참고) 수학적 핵심 원리: 선형 독립성(Linear Independence) 3원 1차 연립방정식에서 미지수 x, y, z에 대한 단 하나의 해(a unique solution)가 존재하기 위한 필수 조건은 주어진 세 개의 방정식이 서로 선형 독립(linearly independent) 관계에 있어야 한다는 것입니다. * 선형 독립 (Linearly Independent): 어떤 방정식도 다른 방정식들의 조합(상수배를 더하거나 빼는 등)으로 만들어질 수 없는 상태입니다. 기하학적으로 이는 3개의 평면(각 방정식은 3D 공간의 평면을 나타냄)이 단 한 개의 점(해)에서 만나는 것을 의미합니다. * 선형 종속 (Linearly Dependent): 하나 이상의 방정식이 다른 방정식들의 조합으로 표현될 수 있는 상태입니다. 이 경우, 새로운 정보를 제공하지 못하는 '잉여' 방정식이 존재하는 것입니다. 기하학적으로 이는 3개의 평면이 하나의 선에서 만나거나(무수히 많은 해), 완전히 겹치거나, 혹은 평행하여 만나지 않는(해가 없음) 상태를 의미합니다. 질문자님의 사례는 '선형 종속'이 되어 무수히 많은 해가 발생하는 경우입니다. 2025 12.30 질문하신 연립 방정식은 미지수가 3개이고 모두 1차인 3원 1차 연립방정식입니다. 이상적으로 문제가 없다면 {x,y,z} 에 대한 좌표가 하나 나오게 됩니다. 원하는 답 {52.5, -2.5, 15} 그런데 두개 조건(식)을 그대로 두고 나머지 하나를 변형하다 보니 원하는 답이 나오지 않는 상황이 발생하였다고 질문하신 상황입니다. 3개의 조건식이 주어진 3원 1차 연립방정식은 조건을 변형해서 하나의 변수를 제거할 수 있습니다. 그러면 2개의 조건식으로 주어지는 2원 1차 연립방정식으로 변형할 수 있습니다. (알아보기 더 쉬워서 변형하는 겁니다) 변경하지 않은 조건의 식(con1) 을 이용해 하나의 y & z 1차 방정식을 유도할 수 있는데요. 나머지 방정식이 con1에서 유도된 방정식과 동일해지면 하나의 답이 구해지지 않는 것입니다. 계산기(ti-nspire)는 {x,y,z} 의 답이 하나가 아니고 무수히 많음을 c1 을 이용해서 표현해 준 것입니다. linear_independence_cond12.tns 2025 12.30 ES 나 EX 와 비교해 'CW 입력 방식이 변화가 큰 편'이어서 지금까지 추천하지는 않았는데, - EX 모델이 완전 단종 & 그로 인해 짝퉁문제가 앞으로 더 심각해질 듯 보임 - 그렇다고 지금 ES 추천하기는 강호의 도리상 고개가 저어지고... 이제 모두 CW로 넘어갈 타이밍이 되지 않았나 싶네요. 그런데 왜 또 4자리로 나와서... ㅋㅋ 미치겠네 2025 12.28