user-0 提问: 用弦截法求f(x) = 1- cos(x)ch(x)的解。 解的范围是[2 ， 5]。

回复:
user: user-0
content: 引用 27 楼 worldy 的回复:[quote=引用 20 楼 u010119353 的回复:] [quote=引用 19 楼 worldy 的回复:] http://blog.csdn.net/worldy/article/details/15341449 运行有错[/quote]  有什么错，将你转换之后的代码发出来我看看[/quote] 我用VC++6.0编的。就是用你的代码，然后就报错了

user: user-1
content: 引用 20 楼 u010119353 的回复:[quote=引用 19 楼 worldy 的回复:] http://blog.csdn.net/worldy/article/details/15341449 运行有错[/quote]  有什么错，将你转换之后的代码发出来我看看

user: user-2
content: 每次求完x[i]的值，要保证f[i]与f[i-1]的值为异号，如为同号，要把x[i-2]的值赋给x[i-1], 在17行加上一条语句试试。 if(f[i]>0&&f[i-1]>0||f[i]<0&&f[x-1]<0) { x[i-1]=x[i-2]; f[i-1]=f[i-2]; }

user: user-3
content: 那你看看函数是否由若干个极值点 只需要其中的一段计算即可。 如果需要都求出来。 分段计算，即可。

user: user-3
content: #include <stdio.h> #include <math.h>  #include <math.h>  #define N 100000 //最多迭代次数,防止发散  int main() { 	int i; 	double x,x1 = 2.0,x2= 5.0; 	double f,f1,f2;  	f1 = 1 - (cos(x1)*cosh(x1)); 	f2 = 1 - (cos(x2)*cosh(x2));  	for(i=0;i<N;i++) 	{ 	     x = x1 - f1 * (x1 - x2 ) / (f1 - f2); 	     f = 1 - cos(x) * cosh(x);  	     if(fabs(f)<0.001) 		 break; 	    // 这个 要这么处理              if(f* f1<0 ){ x1 =x; f1 = f;}              else {x2 =x;f2=f;}        }        printf("%lf\n", x); 	 	return 0; }

user: user-1
content: 你在代码的头上加上： #ifndef BOOL #define BOOL  unsigned int #endif  然后在我给的函数里有个宏，把它注释掉，就是下面几句 #ifdef _DEBUG 			DEBUG_TRACE("替代次数:",n); #endif

user: user-1
content: 不会吧，你连'BOOL类型都没有定义，你用的什么编译器？

user: user-0
content: 引用 21 楼 worldy 的回复:[quote=引用 20 楼 u010119353 的回复:] [quote=引用 19 楼 worldy 的回复:] http://blog.csdn.net/worldy/article/details/15341449 运行有错[/quote]  不会吧？什么错？[/quote]  BOOL SolveEquation(double xa,double xb,double(*Fun)(double),double& Val,double mErr)都是这句话的 error C2146: syntax error : missing ';' before identifier 'SolveEquation' error C2501: 'BOOL' : missing storage-class or type specifiers fatal error C1004: unexpected end of file found

user: user-1
content: 引用 20 楼 u010119353 的回复:[quote=引用 19 楼 worldy 的回复:] http://blog.csdn.net/worldy/article/details/15341449 运行有错[/quote]  不会吧？什么错？

user: user-0
content: 引用 19 楼 worldy 的回复:http://blog.csdn.net/worldy/article/details/15341449 运行有错

user: user-1
content: http://blog.csdn.net/worldy/article/details/15341449

user: user-0
content: 引用 13 楼 worldy 的回复:4.730041? 对的，怎么算的？

user: user-4
content: 仅供参考//用C语言编程，求出sin(x)=(5/6)*x这个方程在区间(0,π/2)的近似解。 #include <math.h> #include <stdio.h> double x,e; void main () {     x=0.001;     e=0.001;     while (1) {         while (1) {             if (sin(x)>5.0/6.0*x) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (sin(x)<5.0/6.0*x) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%.14g\n",x); } //1.026738291371

user: user-3
content: 改成这么做试试：  #include <stdio.h> #include <math.h>  #include <math.h>  #define N 100000 //最多迭代次数,防止发散  int main() { 	int i; 	double x,x1 = 2.0,x2= 5.0; 	double f,f1,f2;  	f1 = 1 - (cos(x1)*cosh(x1)); 	f2 = 1 - (cos(x2)*cosh(x2));  	for(i=0;i<N;i++) 	{ 	     x = x1 - f1 * (x1 - x2 ) / (f1 - f2); 	     f = 1 - cos(x) * cosh(x);  	     if(fabs(f-f1)<0.001) 		 break; 	     double mod =(x1+x2)/2;              if(mid >x){ x1 =x; f1 = f;}              else {x2 =x;f2=f;        }        printf("%lf\n", x); 	 	return 0; }

user: user-3
content: 对于 f(x) = 1- cos(x)ch(x)  f(x) = 0  在 2～5 之间，可能有3个解。 你把这个区间，分割成 2~PI,PI~3/2PI,3/2PI~5 试一试。

user: user-3
content: f(x) = 1- cos(x)ch(x)  f(x) = 0  在函数 cos(x)的每个周期内大约有两个解。 所以弦截法的选点，可能是有问题的。  弦截法在函数凹凸性，相同的区域，效果最好。

user: user-1
content: 4.730041?

user: user-0
content: 引用 10 楼 lm_whales 的回复:[quote=引用 9 楼 u010119353 的回复:] [quote=引用 6 楼 lm_whales 的回复:] 1）i<100,不能保证精度是0.001   2）if(f[i]<0.001 && f[i]>-0.001)            break; 这个判断也是不对的 应该是 abs(f[i]-f[i-1])<0.001 才对。 精度问题还不是大问题，关键是求出来的解不对，差的很大。 不用数组的话迭代有点不方便吧[/quote]   if(f[i]<0.001 && f[i]>-0.001)            break; 不完全是精度问题，这是迭代结束的条件。 只要两次得到的结果之差 ，小于0.001 就满足要求了。 否则，可能会差别很大，或者精度太高，做了许多无用功。  这里只有三个数据 xi ,xi-1,xi-2  // fi,fi-1,fi-2;  //  直接定义成 x,x1,x2            f,f1,f2 你改成这样试试：  #include <stdio.h> #include <math.h>  #include <math.h>  #define N 100000 //最多迭代次数,防止发散  int main() { 	int i; 	double x,x1 = 2.0,x2= 5.0; 	double f,f1,f2;  	f1 = 1 - (cos(x1)*cosh(x1)); 	f2 = 1 - (cos(x2)*cosh(x2));  	for(i=0;i<N;i++) 	{ 		x = x1 - f1 * (x1 - x2 ) / (f1 - f2); 		f = 1 - cos(x) * cosh(x);  		if(fabs(f-f1)<0.001) 			break; 		x2 = x1; 		x1 = x; 		f2 = f1; 		f1 = f; 	} 	printf("%lf\n", x); 	//printf("i=%d,x1= %lf,x2= %lf,f1 = %lf,f2 = %lf\n",i, x1,x2,f1,f2);  	return 0; }  [/quote] 结果还是不对啊

user: user-3
content: 引用 9 楼 u010119353 的回复:[quote=引用 6 楼 lm_whales 的回复:] 1）i<100,不能保证精度是0.001   2）if(f[i]<0.001 && f[i]>-0.001)            break; 这个判断也是不对的 应该是 abs(f[i]-f[i-1])<0.001 才对。 精度问题还不是大问题，关键是求出来的解不对，差的很大。 不用数组的话迭代有点不方便吧[/quote]   if(f[i]<0.001 && f[i]>-0.001)            break; 不完全是精度问题，这是迭代结束的条件。 只要两次得到的结果之差 ，小于0.001 就满足要求了。 否则，可能会差别很大，或者精度太高，做了许多无用功。  这里只有三个数据 xi ,xi-1,xi-2  // fi,fi-1,fi-2;  //  直接定义成 x,x1,x2            f,f1,f2 你改成这样试试：  #include <stdio.h> #include <math.h>  #include <math.h>  #define N 100000 //最多迭代次数,防止发散  int main() { 	int i; 	double x,x1 = 2.0,x2= 5.0; 	double f,f1,f2;  	f1 = 1 - (cos(x1)*cosh(x1)); 	f2 = 1 - (cos(x2)*cosh(x2));  	for(i=0;i<N;i++) 	{ 		x = x1 - f1 * (x1 - x2 ) / (f1 - f2); 		f = 1 - cos(x) * cosh(x);  		if(fabs(f-f1)<0.001) 			break; 		x2 = x1; 		x1 = x; 		f2 = f1; 		f1 = f; 	} 	printf("%lf\n", x); 	//printf("i=%d,x1= %lf,x2= %lf,f1 = %lf,f2 = %lf\n",i, x1,x2,f1,f2);  	return 0; }

user: user-0
content: 引用 6 楼 lm_whales 的回复:1）i<100,不能保证精度是0.001   2）if(f[i]<0.001 && f[i]>-0.001)            break; 这个判断也是不对的 应该是 abs(f[i]-f[i-1])<0.001 才对。 精度问题还不是大问题，关键是求出来的解不对，差的很大。 不用数组的话迭代有点不方便吧