C/C++

Помогите с программированием(задачкой)

f(x)=(ln x)^(11/7) xi= 6,8,10 a=8.5
В интерполяции по Лагранжу на равномерных сетках нет ничего особо сложного. Вот как бы можно было, например, в данном случае это сделать на плюсах:

#include <cstdio>
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
double x0, h = 2;
double f(double x) { return pow(log(x), 11./7.); }
double Lagrange(vector<double> V, double x)
{
int i, j, n = V.size();
double p, s = 0.;
for (j = 0; j < n; j++)
{
p = 1.;
for (i = 0; i < n; i++)
if (i != j)
p *= (x - x0 - i * h) / (h * (j - i));
s += p * V[j];
}
return s;
}
int main()
{
int i, j, n;
while (true)
{
cout << "n: ";
cin >> n;
x0 = 6. - n * h;
vector<double> V(3 + 2 * n);
double x, y, dx = 0.5, e, err = 0.,
emax = 0., fx, eotn, errotn = 0.,
emaxotn = 0.;
for (i = 0; i < 3 + 2 * n; i++)
{
x = x0 + i * h;
V[i] = f(x);
}
j = 8 + 8 * n + 1;
for (i = 0; i < j; i++)
{
x = x0 + i * dx;
fx = f(x);
y = Lagrange(V, x);
e = fabs(y - fx);
eotn = e / fx;
errotn += eotn * eotn;
if (e > emax)
emax = e;
if (eotn > emaxotn) emaxotn = eotn;
printf("%4.1f%22.16f%22.16f%16.6e%16.6e\n",
x, fx, y, e, eotn);
err += e * e;
}
printf("σ = %e, max = %e\nσ = %e, max = %e\n",
sqrt(err / j), emax, sqrt(errotn / j), emaxotn);
V.clear();
}
}В данном случае базовая интерполяция делается по трём точкам (х=6,8,10), если ввести n дополнительных пар точек справа и слева равным нулю. Если ввести n=1 будет 5 узловых точек, на которых строится интерполянт, а при n=2 таких точек будет всего 7. n>2 вводить не надо, а то аргумент логарифма выйдет из "хорошей" области и сразу всё испортится. Увеличение ширины диапазона совсем необязательно должно сказаться на точности интерполяции в начально заданном диапазоне [6;10]. У меня печатаются таблицы интерполяционного значения, самого значения заданной функции, а также модули абсолютной и относительной ошибок при разном значении количества узлов интерполяции с шагом ∆x=0,5 (не путать с равномерным шагом между соседними интерполяционными узлами, который равен двум !), поэтому х=8,5 там обязательно присутствует. В конце выводятся абсолютные среднеквадратичная и максимальная ошибки, а под ними их относительные аналоги. По этим таблицам видно, что при прибавлении каждой дополнительной пары точность интерполяции увеличивается на порядок.
Что касается задания в целом, то в нём слишком много всего намешано (Mathcad, Excel, графика) и со всем этим не ко мне...
Misha Stepura
Misha Stepura
66 572
Лучший ответ