非线性方程组解法实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4)对于n=0,1,2,……Nmax,求xn+1,并计算f(xn+1),若或|xn+1-xn|<ε(容许误差),则停止计算;
3-对分区间法分析
(1)找出f(0)=x的根在存在区间(a,b),并计算出端点的函数值飞f(a),f(b)。
(2)计算f(x)在区间中点值f((a+b)/2).
(3)判断:若f((a+b)/2)~0,则计算停止。否则,若f((a+b)/2)与f(a)异号,则根位于(a,a+b/2)中,以(a+b)/2代替b;若f((a+b)/2)与f(b)异号,则根位于(a+b/2,b)中,以a+b/2代替a。
int i=1;
while(fabs(f(c))>=0.0001)
{
c=(a+b)/2;
if(i<10)
cout<<" ";
cout<<i<<":"<<setiosflags(ios::fixed)<<setprecision(4)<<"当前区间("<<a<<","<<b<<"),区间中点x="<<c;
<<",f(x"<<i<<")="<<f(x0)<<",误差限e="<<fabs(x0-x1)<<endl;
i++;
}
4、实验数据:
5、实验代码:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double f(double x)
}
cout<<"方程近似解x*="<<x0<<endl;
}
void Newton()
{
cout<<"使用Newton法:\n";
cout<<"产生的迭代序列为:\n";
double x0=2,x1=0;
int i=1;
while(fabs(x0-x1)>=0.0001)
{
x1=x0;
x0=x0-f(x0)/g(x0);
}6、实验感想:
通过实验,理解了迭代法、牛顿法、对分区间法、弦线法解非线性方程法的基本原理。
{
double a=1,b=3,c;
cout<<"采用对分区间法:\n";
cout<<"令a=1,b=3,";
cout<<"端点函数值f(a)="<<f(a)<<",f(b)="<<f(b)<<endl;
cout<<"区间("<<a<<","<<b<<")存在f(x)=0的根\n";
cout<<"迭代结果:\n" ;
while(fabs(f(x2))>=0.0001)
{
double e=x2;
x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
if(i<10)
cout<<" ";
cout<<i<<":"<<setiosflags(ios::fixed)<<setprecision(4)<<"当前区间(";
{
x1=x0;
x0=pow((x0*x0+1),1.0/3);
cout<<"x"<<i<<"="<<setiosflags(ios::fixed)<<setprecision(4)<<x0
<<",f(x"<<i<<")="<<f(x0)<<",误差限e="<<fabs(x0-x1)<<endl;
i++;
Menu();
}
}
int main ()
{
cout<<"求f(x)=x*x*x-x*x-1=0在x0=1.5附近的实根。\n";
cout<<"请选择要使用的方法:\n";
cout<<"1.迭代法\n2.Newton法\n3.弦位法\n4.对分区间法\n5.退出\n";
Menu();
return 0;
3、函数分析:
程序中只用到一个主函数,求解线形方程组得算法都放在主函数中,
利用以下函数进行求解:
while(fabs(x0-x1)>=0.0001)
{
x1=x0;
x0=pow((x0*x0+1),1.0/3);
cout<<"x"<<i<<"="<<setiosflags(ios::fixed)<<setprecision(4)<<x0
cout<<x0<<","<<x1<<"),与x轴交点("<<x2<<","<<f(x2)<<"),误差限e="<<fabs(e-x2)<<endl;
if(f(x2)*f(x0)<0)
{
x1=x2;
}
else
{
x0=x2;
}
i++;
}
cout<<"方程近似解x*="<<x2<<endl;
}
void DuiFen()
cout<<"x"<<i<<"="<<setiosflags(ios::fixed)<<setprecision(4)<<x0
<<",f(x"<<i<<")="<<f(x0)<<",误差限e="<<fabs(x0-x1)<<endl;
i++;
}
cout<<"方程近似解x*="<<x0<<endl;
}
(4)重复步骤(2)和(3)的过程,知道区间缩小到容许误差范围之内,此时,区间中点即可作为所要求的根。
4-弦线法分析
(1)选定初始值x0,x1,并计算f(x0),f(x1)。
(2)按迭代公式xn+1=xn-f(xn)/[f(x1)-f(xn-1)](xn-xn-1);计算x2,再求出f(x2);
(3)判别:如果飞f(x2)~0,则迭代停止;否则用(x2,f(x2))和(x1,f(x1))分别替代(x1,f(x1))和(x0,f(x0)),重复步骤2和3直至相邻两次迭代值之差在容许范围。
cout<<",f(x)="<<f(c)<<",误差限e="<<2/pow(2.0,i)<<endl;
i++;
if(f(c)*f(a)<0)
{
b=c;
}
else
{
a=c;
}
}
cout<<"方程近似解x*="<<c<<endl;
}
void Menu()
{
int n;
cin>>n;
switch(n)
{
case 1:
(3)如果|x1-x0|<ε则停止计算;否则用x1代替x0,重复步骤(2)和(3)的过程;
2-牛顿法分析:
(1)解非线性方程f(x)=0的Newton法是把非线性化的一种近似方法,把f(x)在点x0附近展开成Taylor级数;
(2)取其线性部分作为非线性方程f(x)=0的近似方程;
(3)再把在附近张开成Taylor级数,也取其线性部分作为f(x)=0的近似方程;
void XianWei()
{
double x0=1,x1=2.5,x2=2;
cout<<"采用弦位法: \n";
cout<<"选定曲线y=f(x)上的两个点P0("<<x0<<","<<f(x0)<<")和P1("<<x1<<","<<f(x1)<<")\n";
cout<<"迭代结果:\n" ;
int i=1;
DieDai();
Menu();
break;
case 2:
Newton();
Menu();
break;
case 3:
XianWei();
Menu();
break;
case 4:
DuiFen();
Menu();
break;
case 5:
return;
default:
cout<<"输入有误,请重新输入!\n";
{
x=x*x*x-x*x-1;
return x;
}
double g(double x)
{
x=3*来自百度文库*x-2*x;
return x;
}
void DieDai()
{
cout<<"使用迭代法:\n" ;
cout<<"产生的迭代序列为:\n";
double x0=2,x1=0;
int i=1;
while(fabs(x0-x1)>=0.0001)
《数值分析》实验报告
实验序号:实验三题目名称:非线性方程解法
学号:姓名:
任课教师:专业班级:
1、实验目的:
编写用迭代法、牛顿法、对分区间法、弦线法解非线性方程的程序;
2、实验分析:
计算方法分析:
1-迭代法分析
(1)选取初值x0,并确定方程f(x)=0的等价形式x=φ(x);
(2)计算x1=φ(x0);
3-对分区间法分析
(1)找出f(0)=x的根在存在区间(a,b),并计算出端点的函数值飞f(a),f(b)。
(2)计算f(x)在区间中点值f((a+b)/2).
(3)判断:若f((a+b)/2)~0,则计算停止。否则,若f((a+b)/2)与f(a)异号,则根位于(a,a+b/2)中,以(a+b)/2代替b;若f((a+b)/2)与f(b)异号,则根位于(a+b/2,b)中,以a+b/2代替a。
int i=1;
while(fabs(f(c))>=0.0001)
{
c=(a+b)/2;
if(i<10)
cout<<" ";
cout<<i<<":"<<setiosflags(ios::fixed)<<setprecision(4)<<"当前区间("<<a<<","<<b<<"),区间中点x="<<c;
<<",f(x"<<i<<")="<<f(x0)<<",误差限e="<<fabs(x0-x1)<<endl;
i++;
}
4、实验数据:
5、实验代码:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double f(double x)
}
cout<<"方程近似解x*="<<x0<<endl;
}
void Newton()
{
cout<<"使用Newton法:\n";
cout<<"产生的迭代序列为:\n";
double x0=2,x1=0;
int i=1;
while(fabs(x0-x1)>=0.0001)
{
x1=x0;
x0=x0-f(x0)/g(x0);
}6、实验感想:
通过实验,理解了迭代法、牛顿法、对分区间法、弦线法解非线性方程法的基本原理。
{
double a=1,b=3,c;
cout<<"采用对分区间法:\n";
cout<<"令a=1,b=3,";
cout<<"端点函数值f(a)="<<f(a)<<",f(b)="<<f(b)<<endl;
cout<<"区间("<<a<<","<<b<<")存在f(x)=0的根\n";
cout<<"迭代结果:\n" ;
while(fabs(f(x2))>=0.0001)
{
double e=x2;
x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
if(i<10)
cout<<" ";
cout<<i<<":"<<setiosflags(ios::fixed)<<setprecision(4)<<"当前区间(";
{
x1=x0;
x0=pow((x0*x0+1),1.0/3);
cout<<"x"<<i<<"="<<setiosflags(ios::fixed)<<setprecision(4)<<x0
<<",f(x"<<i<<")="<<f(x0)<<",误差限e="<<fabs(x0-x1)<<endl;
i++;
Menu();
}
}
int main ()
{
cout<<"求f(x)=x*x*x-x*x-1=0在x0=1.5附近的实根。\n";
cout<<"请选择要使用的方法:\n";
cout<<"1.迭代法\n2.Newton法\n3.弦位法\n4.对分区间法\n5.退出\n";
Menu();
return 0;
3、函数分析:
程序中只用到一个主函数,求解线形方程组得算法都放在主函数中,
利用以下函数进行求解:
while(fabs(x0-x1)>=0.0001)
{
x1=x0;
x0=pow((x0*x0+1),1.0/3);
cout<<"x"<<i<<"="<<setiosflags(ios::fixed)<<setprecision(4)<<x0
cout<<x0<<","<<x1<<"),与x轴交点("<<x2<<","<<f(x2)<<"),误差限e="<<fabs(e-x2)<<endl;
if(f(x2)*f(x0)<0)
{
x1=x2;
}
else
{
x0=x2;
}
i++;
}
cout<<"方程近似解x*="<<x2<<endl;
}
void DuiFen()
cout<<"x"<<i<<"="<<setiosflags(ios::fixed)<<setprecision(4)<<x0
<<",f(x"<<i<<")="<<f(x0)<<",误差限e="<<fabs(x0-x1)<<endl;
i++;
}
cout<<"方程近似解x*="<<x0<<endl;
}
(4)重复步骤(2)和(3)的过程,知道区间缩小到容许误差范围之内,此时,区间中点即可作为所要求的根。
4-弦线法分析
(1)选定初始值x0,x1,并计算f(x0),f(x1)。
(2)按迭代公式xn+1=xn-f(xn)/[f(x1)-f(xn-1)](xn-xn-1);计算x2,再求出f(x2);
(3)判别:如果飞f(x2)~0,则迭代停止;否则用(x2,f(x2))和(x1,f(x1))分别替代(x1,f(x1))和(x0,f(x0)),重复步骤2和3直至相邻两次迭代值之差在容许范围。
cout<<",f(x)="<<f(c)<<",误差限e="<<2/pow(2.0,i)<<endl;
i++;
if(f(c)*f(a)<0)
{
b=c;
}
else
{
a=c;
}
}
cout<<"方程近似解x*="<<c<<endl;
}
void Menu()
{
int n;
cin>>n;
switch(n)
{
case 1:
(3)如果|x1-x0|<ε则停止计算;否则用x1代替x0,重复步骤(2)和(3)的过程;
2-牛顿法分析:
(1)解非线性方程f(x)=0的Newton法是把非线性化的一种近似方法,把f(x)在点x0附近展开成Taylor级数;
(2)取其线性部分作为非线性方程f(x)=0的近似方程;
(3)再把在附近张开成Taylor级数,也取其线性部分作为f(x)=0的近似方程;
void XianWei()
{
double x0=1,x1=2.5,x2=2;
cout<<"采用弦位法: \n";
cout<<"选定曲线y=f(x)上的两个点P0("<<x0<<","<<f(x0)<<")和P1("<<x1<<","<<f(x1)<<")\n";
cout<<"迭代结果:\n" ;
int i=1;
DieDai();
Menu();
break;
case 2:
Newton();
Menu();
break;
case 3:
XianWei();
Menu();
break;
case 4:
DuiFen();
Menu();
break;
case 5:
return;
default:
cout<<"输入有误,请重新输入!\n";
{
x=x*x*x-x*x-1;
return x;
}
double g(double x)
{
x=3*来自百度文库*x-2*x;
return x;
}
void DieDai()
{
cout<<"使用迭代法:\n" ;
cout<<"产生的迭代序列为:\n";
double x0=2,x1=0;
int i=1;
while(fabs(x0-x1)>=0.0001)
《数值分析》实验报告
实验序号:实验三题目名称:非线性方程解法
学号:姓名:
任课教师:专业班级:
1、实验目的:
编写用迭代法、牛顿法、对分区间法、弦线法解非线性方程的程序;
2、实验分析:
计算方法分析:
1-迭代法分析
(1)选取初值x0,并确定方程f(x)=0的等价形式x=φ(x);
(2)计算x1=φ(x0);