c·c++/c 프로그래밍

수치해석-뉴톤메쏘드

바로이순간 2012. 6. 13. 10:47

#include <stdio.h>

#include <math.h>

#define EPS pow(10.0,-8.0) /* epsilon 의 설정 */

#define NMAX 10 /* 최대반복횟수 */

 

void newton(double x, double(*)(double), double(*)(double)); /* Newton법 */

double f1(double x); /* f(x) 계산 */

double df1(double x); /* f'(x)의 계산 */

double f2(double x); /* f(x) 계산 */

double df2(double x); /* f'(x)의 계산 */

 

int main(void){

    double x;

    double (*fp1)(double), (*dfp1)(double), (*fp2)(double), (*dfp2)(double);


    fp1=&f1; dfp1=&df1; fp2=&f2; dfp2=&df2;

    printf("함수1의 초기값x0을 입력하세요\n");

    scanf("%lf",&x);

 

    newton(x, f1, df1);


    printf("함수2의 초기값x0을 입력하세요\n");

    scanf("%lf",&x);


    newton(x, f2, df2);


    return 0;

}

 

/* Newton법 */

void newton(double x, double(*f)(double), double(*df)(double)){

    int n=0; 

    double d;

 

    do{

        d=-(*f)(x)/(*df)(x);

        x=x+d;

        n++;

    }while(fabs(d)>EPS&&n<NMAX);

 

    if(n==NMAX){

        printf("답을 발견하지 못했습니다.\n");

    }

    else{

        printf("답은 x=%f 입니다.\n",x);

    }

}

 

/* 함수의 정의 */

double f1(double x){

    return 3.0*x*x*x+4.0*x*x-5.0;

}

/* 함수의 정의 */

double f2(double x){

    return exp(3.0*x)-10*x;

}

 

double df1(double x){

    return 9.0*x*x+8.0*x;

}

double df2(double x){

    return 3.0*exp(3.0*x)-10;

}




'c·c++ > c 프로그래밍' 카테고리의 다른 글

strdup 활용하기  (0) 2012.06.13
한줄의 단어를 역순으로 출력하기  (0) 2012.06.13
.smi 파일에서 영어만 추출하기.  (0) 2012.06.11
threaded binary tree  (0) 2012.06.09
scanf_s 의 사용법  (0) 2012.06.09