📄
字号:
非线性方程的Newton下山法2007-07-16 18:48#include<iostream>
using namespace std;
#include<math.h>
#define n 3 //假定方程最高次数是3
#define N 50 //最多迭代50次
#define err 0.00001 //最大允许误差
double f(double *a,double x) //指定f的系数,求出其值
{
int i;
double r=0;
for(i=0;i<=n;i++)
r+=a[i]*pow(x,n-i);
return r;
}
double ff(double *a,double x) //求f的导函数的值
{
int i;
double r=0;
for(i=0;i<=n;i++)
r+=(n-i)*a[i]*pow(x,n-i-1);
return r;
}
void main()
{
int i;
double x[N],a[n+1],t[N]={0},lamda=1;
cout<<"Please input the initialized x0:\n";
cin>>x[0];
cout<<"Please input the matrix of coefficients:\n";
for(i=0;i<=n;i++)
cin>>a[i];
for(i=0;i<N;i++)
{
t[i+1]=x[i]-f(a,x[i])/ff(a,x[i]);
x[i+1]=lamda*t[i+1]+(1-lamda)*x[i];
if(fabs(f(a,x[i+1])>fabs(f(a,x[i])))) lamda=lamda/2; //注意判断条件,是大于
if(fabs(x[i+1]-x[i])<err) {cout<<"The root is:\n"<<x[i+1]<<"\n";break;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -