EPI00 개발일지
다항함수 정적분 프로그램 (C++, 코드 only) 본문
오늘 동아리 시간에 다항함수 미분을 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가 아니라 미적분 교과에서 나오는 것인지라 당연히도 다항함수 적분이 아니라 삼각함수, 로그함수, 지수함수를 적분하라고 가르쳐주는 것이긴 한데(사실 리미트와 시그마로 표현된 식을 적분식으로 바꿔서 적분하라고 나오지만), 뭐 사실 로다삼지 다 대응되는 적분 프로그램을 만드는 것이야 어렵지 않지만, 입력을 받는게 귀찮다. 그게 가장 큰 문제다. 입력 방식을 짜는게 정말 매우 엄청 귀찮다.
그래서 다항함수 적분으로만 만들었다...
'프로그램 개발?' 카테고리의 다른 글
파이썬 순열, 조합, 중복순열, 중복조합 +파스칼의 삼각형 계산하는 코드 (2) | 2021.08.09 |
---|---|
삼각함수+다항함수 정적분 (파이썬, 코드 only) (1) | 2021.07.25 |
(코딩 교육용)C언어 순서맞추기 문제내는 프로그램 (0) | 2021.06.16 |
표준정규분포 확률밀도함수 정적분 (1) | 2021.06.07 |
정 규 분 포 (0) | 2021.05.31 |