Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define task "newton"
- using namespace std;
- const int N = 1010;
- const double EPS = 1e-9;
- double x[N], y[N], a[N][N],f[N][N],d[N];
- int n, deg;
- void init(){
- double xt, yt;
- bool ok;
- freopen("input.txt", "r", stdin);
- // nhập bảng số liệu xem có trùng x hay ko
- while (scanf("%lf%lf", &xt, &yt)!=EOF){
- ok=1; for (int i=1; i<=n; ++i) if (fabs(x[i]-xt)<EPS) ok=0;
- if (ok){
- n++; x[n]=xt; y[n]=yt;
- }
- }
- // tính bảng tỷ hiệu
- for (int i=1; i<=n; ++i) a[i][1]=y[i];
- for (int j=2; j<=n; ++j)
- for (int i=j; i<=n; ++i){
- a[i][j]=(a[i-1][j-1]-a[i][j-1])/(x[i-j+1]-x[i]);
- if (fabs(a[i][j])<EPS) a[i][j]=fabs(a[i][j]);
- }
- // ktra xem có cột nào bằng 0 hay ko
- for (int j=1; j<=n+1; ++j){
- bool ok=1;
- for (int i=j; i<=n; ++i)
- if (fabs(a[i][j])>EPS) ok=0;
- else a[i][j]=fabs(a[i][j]);
- if (ok){
- deg=j-1;
- break;
- }
- }
- cout<<deg<<endl;
- }
- void addPoint(){
- freopen("input2.txt", "r", stdin);
- double xt, yt;
- bool ok;
- int m=n;
- while (scanf("%lf%lf", &xt, &yt)!=EOF){
- ok=1; for (int i=1; i<=n; ++i) if (fabs(x[i]-xt)<EPS) ok=0;
- if (ok){
- n++; x[n]=xt; y[n]=yt;
- }
- }
- for (int i=m+1; i<=n; ++i) a[i][1]=y[i];
- for (int j=2; j<=n; ++j)
- for (int i=max(m+1, j); i<=n; ++i){
- a[i][j]=(a[i-1][j-1]-a[i][j-1])/(x[i-j+1]-x[i]);
- if (fabs(a[i][j])<EPS) a[i][j]=fabs(a[i][j]);
- }
- int dt=deg;
- for (int j=dt; j<=n+1; ++j){
- ok=1;
- for (int i=j; i<=n; ++i){
- if (fabs(a[i][j])>EPS) ok=0;
- else a[i][j]=fabs(a[i][j]);
- }
- if (ok){
- deg=j-1;
- break;
- }
- }
- cout<<deg<<endl;
- }
- void print(){
- for (int i=1; i<=n; ++i)
- { printf("%-9.3f\t",x[i] );
- for (int j=1; j<=n; ++j){
- printf("%-9.3f ", a[i][j]);
- if (j==n) printf("\n");
- }
- }
- }
- void calcfx(){
- double z, ans, cur, err;
- freopen("input3.txt", "r", stdin);
- f[1][1]=1;
- // tính ma trận 2 chiều lưu hệ số lúc nhân từng đa thức nhỏ
- for(int i=2;i<=deg;i++){
- for (int j=1;j<=i;j++) {
- if (j==i) f[i][j] =1;
- else if (j==1) f[i][j] = -f[i-1][j]*x[i-1];
- else f[i][j] = f[i-1][j-1]-f[i-1][j]*x[i-1];
- }
- }
- for (int i=1;i<=deg;i++){
- printf("%-9.3f \t",a[i][i]);
- for(int j=1;j<=i;j++)
- printf("%-9.3f \t",f[i][j]);
- printf("\n");
- }
- // tính hệ số đa thức nội suy
- for (int i=1;i<=deg;i++) {
- d[i]=0;
- for (int j=1;j<=deg;j++) {
- d[i]+=f[j][i]*a[j][j];
- }
- }
- // tính P(x) tại 1 điểm và sai số tại điểm đó
- printf("f(x)= ");
- for(int i=1;i<=deg;i++) if (d[i]!=0) printf("%9.3fx^%d + \t",d[i],i-1);
- printf("\n");
- while (scanf("%lf", &z)!=EOF){
- cur=1; ans=a[1][1];
- for ( int i=2; i<=deg; ++i){
- cur*=(z-x[i-1]);
- ans+=a[i][i]*cur;
- }
- err = cur*(z-x[deg])*a[deg][deg];
- printf("f(%.3f) ~= %.3f | err ~= %.3f\n ", z, ans,err);
- }
- }
- int main(){
- freopen("result.txt", "w", stdout);
- init();
- print();
- calcfx();
- addPoint();
- print();
- calcfx();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement