Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define task "newton"
  3. using namespace std;
  4. const int N = 1010;
  5. const double EPS = 1e-9;
  6. double x[N], y[N], a[N][N],f[N][N],d[N];
  7. int n, deg;
  8.  
  9. void init(){
  10. double xt, yt;
  11. bool ok;
  12. freopen("input.txt", "r", stdin);
  13. // nhập bảng số liệu xem có trùng x hay ko
  14. while (scanf("%lf%lf", &xt, &yt)!=EOF){
  15. ok=1; for (int i=1; i<=n; ++i) if (fabs(x[i]-xt)<EPS) ok=0;
  16. if (ok){
  17. n++; x[n]=xt; y[n]=yt;
  18. }
  19. }
  20. // tính bảng tỷ hiệu
  21. for (int i=1; i<=n; ++i) a[i][1]=y[i];
  22. for (int j=2; j<=n; ++j)
  23. for (int i=j; i<=n; ++i){
  24. a[i][j]=(a[i-1][j-1]-a[i][j-1])/(x[i-j+1]-x[i]);
  25. if (fabs(a[i][j])<EPS) a[i][j]=fabs(a[i][j]);
  26. }
  27. // ktra xem có cột nào bằng 0 hay ko
  28. for (int j=1; j<=n+1; ++j){
  29. bool ok=1;
  30. for (int i=j; i<=n; ++i)
  31. if (fabs(a[i][j])>EPS) ok=0;
  32. else a[i][j]=fabs(a[i][j]);
  33. if (ok){
  34. deg=j-1;
  35. break;
  36. }
  37. }
  38. cout<<deg<<endl;
  39. }
  40.  
  41. void addPoint(){
  42. freopen("input2.txt", "r", stdin);
  43. double xt, yt;
  44. bool ok;
  45. int m=n;
  46. while (scanf("%lf%lf", &xt, &yt)!=EOF){
  47. ok=1; for (int i=1; i<=n; ++i) if (fabs(x[i]-xt)<EPS) ok=0;
  48. if (ok){
  49. n++; x[n]=xt; y[n]=yt;
  50. }
  51. }
  52. for (int i=m+1; i<=n; ++i) a[i][1]=y[i];
  53. for (int j=2; j<=n; ++j)
  54. for (int i=max(m+1, j); i<=n; ++i){
  55. a[i][j]=(a[i-1][j-1]-a[i][j-1])/(x[i-j+1]-x[i]);
  56. if (fabs(a[i][j])<EPS) a[i][j]=fabs(a[i][j]);
  57. }
  58. int dt=deg;
  59. for (int j=dt; j<=n+1; ++j){
  60. ok=1;
  61. for (int i=j; i<=n; ++i){
  62. if (fabs(a[i][j])>EPS) ok=0;
  63. else a[i][j]=fabs(a[i][j]);
  64. }
  65. if (ok){
  66. deg=j-1;
  67. break;
  68. }
  69. }
  70. cout<<deg<<endl;
  71. }
  72.  
  73. void print(){
  74. for (int i=1; i<=n; ++i)
  75. { printf("%-9.3f\t",x[i] );
  76. for (int j=1; j<=n; ++j){
  77. printf("%-9.3f ", a[i][j]);
  78. if (j==n) printf("\n");
  79. }
  80. }
  81. }
  82.  
  83. void calcfx(){
  84. double z, ans, cur, err;
  85. freopen("input3.txt", "r", stdin);
  86. f[1][1]=1;
  87. // tính ma trận 2 chiều lưu hệ số lúc nhân từng đa thức nhỏ
  88. for(int i=2;i<=deg;i++){
  89. for (int j=1;j<=i;j++) {
  90. if (j==i) f[i][j] =1;
  91. else if (j==1) f[i][j] = -f[i-1][j]*x[i-1];
  92. else f[i][j] = f[i-1][j-1]-f[i-1][j]*x[i-1];
  93. }
  94. }
  95. for (int i=1;i<=deg;i++){
  96. printf("%-9.3f \t",a[i][i]);
  97. for(int j=1;j<=i;j++)
  98. printf("%-9.3f \t",f[i][j]);
  99. printf("\n");
  100. }
  101. // tính hệ số đa thức nội suy
  102. for (int i=1;i<=deg;i++) {
  103. d[i]=0;
  104. for (int j=1;j<=deg;j++) {
  105. d[i]+=f[j][i]*a[j][j];
  106. }
  107. }
  108. // tính P(x) tại 1 điểm và sai số tại điểm đó
  109. printf("f(x)= ");
  110. for(int i=1;i<=deg;i++) if (d[i]!=0) printf("%9.3fx^%d + \t",d[i],i-1);
  111. printf("\n");
  112. while (scanf("%lf", &z)!=EOF){
  113. cur=1; ans=a[1][1];
  114. for ( int i=2; i<=deg; ++i){
  115. cur*=(z-x[i-1]);
  116. ans+=a[i][i]*cur;
  117. }
  118. err = cur*(z-x[deg])*a[deg][deg];
  119. printf("f(%.3f) ~= %.3f | err ~= %.3f\n ", z, ans,err);
  120.  
  121. }
  122. }
  123. int main(){
  124. freopen("result.txt", "w", stdout);
  125. init();
  126. print();
  127. calcfx();
  128. addPoint();
  129. print();
  130. calcfx();
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement