|
|
【答案】应助回帖
感谢参与,应助指数 +1
http://edisonshih.pixnet.net/blog/post/30455128-%5bc語言數值分析%5d-方程式求解---bisector%28二分法%29
// ==================================
// filename: BiSector.cpp
// use bisector method to find solution
// author : Edison.Shih.
// Date : 2010.3.6
// ** all rights resever **
// ==================================
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SMALL (double)(10E-4)
#define NO_FIND_NUM (double)(-9999.0)
// =======================================
// f(x) = x^3 + 2x^2 -5x +1,
// have sol at (-4, -3), (0,1), (1, 2)
double func(double x){
return (x*x*x + 2*x*x - 5*x + 1);
}
// =======================================
double bisector(double (*fptr)(double),
double low,
double high,
double small)
{// small: error rate
double x = (low+high) / 2.0;
double xvalue = 0.0; // f(x) = f( (h+low)/2 )
double hvalue = 0.0; // f(h)
double lvalue = 0.0; // f(low)
int times = 0;
//printf("==========================\n" ;
do{
xvalue = (*fptr)(x);
hvalue = (*fptr)(high);
lvalue = (*fptr)(low);
/*
printf("==========================\n" ;
printf("%d times:\n", times++);
printf("L :%8.4lf,H :%8.4lf,X :%8.4lf\n",
low, high, x);
printf("f(L):%8.4lf,f(H):%8.4lf,f(X) :%8.4lf\n",
lvalue, hvalue, xvalue);
*/
if(xvalue>0 && lvalue>0 && hvalue<0) low = x;
else if(xvalue>0 && lvalue<0 && hvalue>0) high = x;
else if(xvalue<0 && lvalue>0 && hvalue<0) high = x;
else if(xvalue<0 && lvalue<0 && hvalue>0) low = x;
else return (NO_FIND_NUM); // no find ans
x = (high + low) / 2;
}while(fabs(xvalue) > small);
// printf("==========================\n" ;
return x;
}
// =======================================
int main(int argc, char **argv)
{
double sol = 0.0;
for(double x=-5.0; x<=5.0; x=x+1.0)
{
sol = bisector(func, x, x+1.0, SMALL);
printf("sol at (%.0lf,%.0lf):",x,x+1);
if(sol==NO_FIND_NUM) {
printf("no find sol\n" ;
}
else {
printf("%.4lf\n",sol);
}
}
return 0;
} |
|