首页
IT
登录
6mi
u
盘
搜
搜 索
IT
实训(一)二分法解非线性方程和实训(二)一元多项式分段插值
实训(一)二分法解非线性方程和实训(二)一元多项式分段插值
xiaoxiao
2021-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
)