实训(一)二分法解非线性方程和实训(二)一元多项式分段插值

    xiaoxiao2021-04-14  70

    // 实训一 二分法解线性方程 // f(x)=x^2-x-2=0 有俩个精确实根 // 使用迭代方法 #include<iostream> #include<cmath> using namespace std; double fx(double x) int main() { const double eps=1.e-5; //计算精度:允许误差**1.e和1e double L,R,M; //区间左端点、右端点R、中点M double fL,fM; //区间左端点和中点的函数值 int Count=0; //迭代次数 cout<<"单调区间左端点L="cin>>L; cout<<"单调区间右端点R="cin>>R; cout<<"f(L)="<<fx(L)<<",f(R)"<<fx(R)<<endl; if(fx(L)*fx(R)>0) //有解区间:俩端点函数值异号 { cout<<"非有解区间:\n";system("pause");return 0; } while(fabs(R-L)>eps) //收敛性判断:精度控制 { cout<<++Count<<"次:"; M=(L+R)/2; fL=fx(L);fM=fx(M); if(fL*fM<0)R=M; //解在左区间:右端点移位 else if(fL*fM>0)L=M;//解在右区间:左端点移位 else break//注1; cout<<L<<","<<R<<endl; } cout<<"方程的解:"<<"x="<<M<<"\n函数值:"<<fx(M)<<endl; system("pause");return 0; } //注1的作用:恰好中值输出为0 //do 循环 while 判断 //for(;判断;) //若不用break,while语句添加&&fL*fR!=0 //其他的方法:计算机数值弦割法 //若不能确定若干个单调小区间有多少个值,那么分块求解。 //可以通过判断二次求导,判断单调性。 //实训(二)一元多项式分段插值 //内插法,针对的是主要是拉格朗插值,牛顿插值等 #include<iostream> using namespace std; const double x[7]={1.0,1.5,2.3,3.5,5.0,6.2,7.0} const double fx[7]={0.8,1.0,2.0,2.5,1.6,1.8,1.4} double Linear(double xx,int L) { double y; y=fx[L]*(xx-x[L+1])/(x[L]-x[L+1])+fx[L+1]*(xx-x[L])/(x[L+1]-x[L]); return y; } double Parabola(double xx,int L) { double y; y=fx[L]*(xx-x[L+1])*(xx-x[L+2])/(x[L]-x[L+1])*(x[L]-x[L+2])+ fx[L+1]*(xx-x[L])*(xx-x[L+2])/((x[L+1]-x[L])*(x[L+1]-x[L+2]))+ fx[L+2]*(xx-x[L])*(xx-x[L+1])/((x[L+2]-x[L])*(x[L+2]-x[L+1])); return y; } int main() { double xx=0;//插值点 cout<<" 输入-1结束"<<endl; while(xx!=-1) { cout<<" 输入插值点:"; cin>>xx; if(xx==-1) { cout<<"结束\n"; system("pause") ; return 0; } if(xx<1||xx>7){ cout<<"插值点越界!\n";continue; } if(xx>x[4])cout<<"f(x)="<<Parabola(xx,4)<<endl; else if(xx>x[3])cout<<"f(x)="<<Linear(xx,3)<<endl; else if(xx>x[2])cout<<"f(x)="<<Linear(xx,2)<<endl; else cout<<"f(x)="<<Parabola(xx,0)<<endl; } system("pause"); return 0; } //插值8位的在上一篇http://blog.csdn.net/think_self/article/details/70147930 // // // //
    转载请注明原文地址: https://ju.6miu.com/read-670354.html

    最新回复(0)