关于一个方程的数值求解程序
今日看到群里的一个方程求解。
令1/sqrt(r) = x, 则 简化式子为 x = -2log( K/(3.71D) + x *2.51/Re)
通过泰勒一阶展开式,用线性逼近进行迭代求解。
x = x1 - f(x1)/ff(x1). 这里ff为f的一阶导数
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
double x,x1,f,ff,D,re,k;
cout<<"请输入D re k :"<<endl;
cin>>D>>re>>k;
cout<<"D:"<<D<<endl;
cout<<"re:"<<re<<endl;
cout<<"k:"<<k<<endl;
x = 1 ; //迭代初始值
do{
x1=x;
f= x1 + 2.0* log10( k/(3.71 *D) + (2.51 * x1 )/ re );
ff = 1.0 + ( 2.0 / ( k/(3.71 *D) + (2.51 * x1 )/ re ) ) * (2.51 / re ) /2.3;
x=x1-f/ff;
}while(fabs(x-x1)>=1e-6);
cout << 1/(x*x) <<endl;
// printf("%.6f", 1/(x*x) );
system("pause");
return 0;
}