EPI00 개발일지

다항함수 정적분 프로그램 (C++, 코드 only) 본문

프로그램 개발?

다항함수 정적분 프로그램 (C++, 코드 only)

EPI00 2021. 7. 14. 13:23

오늘 동아리 시간에 다항함수 미분을 80줄이나 사용하며 만든 친구를 엿먹이기 위해 만들었다. 
근데 사실 걔가 나처럼 코딩에 반쯤 미쳐있는 것도 아닌지라 80줄이고 100줄이고 다항함수 미분 구현했다는 점이 대단한 부분이긴 한데, 아무튼 난 내 실력을 과시하고 싶었다. 
사실 실력이고 뭐고 적분법 쓴게 아니라 구분구적법으로 구현한거라 그친구가 만든 미분 프로그램보단 난이도가 쉽다. 그친구는 미분법을 썼으니까. 

사용 언어 : C++
제작기간 : 21년 7월 14일 오전 11시 50분 ~ 오후 12시 40분 (사실 당시 오류 해결 못해서 밥먹고와서 다시짜긴 했으나 다시짜기 시작해서 10초만에 문제점을 수정했으니 이건 무시 가능할 것이다)

코드 :

 

#include <iostream>
#include <math.h>>

#define A 0.000001

using namespace std;

double f(double a, int *ns, int maxn);

int main() {
	int maxn;
	cout<<"최고차항의 차수 입력 : ";
	cin>>maxn;
	int ns[maxn+1];
	cout<<maxn<<"차항부터 상수항까지의 계수를 입력 : ";
	for(int i = 0; i < maxn+1; i++) cin>>ns[i];
	double a, b;
	cout<<"적분 범위 입력 : ";
	cin>>a>>b;
	double s = 0;
	double t = (b-a)*A;
	for(double i = 1; i <= (1/A); i+=1) s += f(a+(t*i),ns,maxn)*t;
	cout<<a<<"부터 "<<b<<"까지의"<<"f(x) = ";
	for(int i = 0; i < maxn+1; i++) cout<<"+"<<ns[i]<<"x^"<<maxn-i<<" ";
	cout<<"의 적분값 : "<<s;
	return 0;
}

double f(double a, int *ns, int maxn){
	double r = 0, t;
	int j;
	for(int i = 0; i < maxn+1; i++){
		j = maxn-i;
		t = ns[i] * pow(a, j);
		r += t;
	}
	return r;
}

 

 

구분구적법이란?

이다. 이걸 그림으로 표현하…
…기는 싫다. 구글에 구분구적법 검색하면 많이 나온다. 

아무튼, 위의 수식을 이용해서 정적분을 수행하는 코드를 작성했는데, 코드는 10분만에 다 짰었지만 40분 가까이를 완성 못하고 있었던 이유는....

코드를 이딴 수식대로 만들었기 때문이다. 아, 참고로 lim n->1000000은 아무 문제가 되지 않을 것이다. 컴퓨터는 바보라 극한의 개념을 이해하지 못하기 때문에, 사실상 코드상에선 lim n->1000000이 아니라 n=1000000으로 입력하긴 했지만 아무튼 그건 문제가 아니다. 
여기서 문제는 시그마 k=1부터 n까지여야 하는걸 시그마 k=a부터 b까지로 입력을 했었다는 것이다. 

 

아무튼, 완성했으니 된 것일 것이다. 

사실 구분구적법은 현행 교육과정상(내가 그 교육과정을 밟고있는 중이므로) 수학2가 아니라 미적분 교과에서 나오는 것인지라 당연히도 다항함수 적분이 아니라 삼각함수, 로그함수, 지수함수를 적분하라고 가르쳐주는 것이긴 한데(사실 리미트와 시그마로 표현된 식을 적분식으로 바꿔서 적분하라고 나오지만), 뭐 사실 로다삼지 다 대응되는 적분 프로그램을 만드는 것이야 어렵지 않지만, 입력을 받는게 귀찮다. 그게 가장 큰 문제다. 입력 방식을 짜는게 정말 매우 엄청 귀찮다.
그래서 다항함수 적분으로만 만들었다...