Форум программистов, компьютерный форум CyberForum.ru

Аппроксимация и СКО - C++

Восстановить пароль Регистрация
 
maxick96
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 41
07.11.2013, 00:56     Аппроксимация и СКО #1
Тут возникла проблемка, вот задание:
"Сделать аппроксимацию(квадратичную), тобишь найти полином второй степени и найти среднеквадратичное отклонение"
аппроксимирующий многочлен я нашёл, но вот среднеквадратичное отклонение не получается
нужно сделать на Mathcad и на с++
на Маткаде сделано: ответ = 0.006393
такой же ответ должен получиться и на сишке
а получается какое то большое число
вопрос: что я сделал не так?!

P.S. на часть кода можете внимание не обращать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
//Правая часть дифференциального уравнения
long double fdiff(long double x, long double y, int k)
{
    return k*sqrt(y)+sqrt(x);
}
//Точное(Аналитическое) решение
long double ft(long double x, int k)
{
    if(k==1)
        return x+2*sqrt(x+1)+2;
}
//Массив значений X
void masX(long double* x, long double a, long double h, int n)
{
    for(int i=0; i<=n; i++)
        x[i]=a+i*h;
}
//Массив значений Y численного решения
void masY(long double* x, long double* y, long double h, int n, int k)
{
    y[0]=1;
    for(int i=0; i<n; i++)
        y[i+1]=y[i]+h*fdiff(x[i], y[i], k);
}
//Массив значений Y аналитического решения
void masYT(long double* x, long double* yt, int n, int k)
{
    for(int i=0; i<=n; i++)
        yt[i]=ft(x[i],k);
}
//Аппроксимация численного решения, поиск коэффициетов полинома методом Гаусса
void approx(long double* x, long double* y, int k, long double& c0, long double& c1, long double& c2)
{
    int n=3, m=4;
    long double a[3][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0}},
                a0[3][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0}};
    a0[0][0]=a[0][0]=k+1;
    for(int i=0; i<=k; i++)
        a0[0][1]=a0[1][0]=a[0][1]=a[1][0]=a[1][0]+x[i];
    for(int i=0; i<=k; i++)
        a0[0][2]=a0[1][1]=a0[2][0]=a[0][2]=a[1][1]=a[2][0]=a[2][0]+pow(x[i],2);
    for(int i=0; i<=k; i++)
        a0[1][2]=a0[2][1]=a[1][2]=a[2][1]=a[2][1]+pow(x[i],3);
    for(int i=0; i<=k; i++)
        a0[2][2]=a[2][2]=a[2][2]+pow(x[i],4);
    for(int i=0; i<=k; i++)
        a0[0][3]=a[0][3]=a[0][3]+y[i];
    for(int i=0; i<=k; i++)
        a0[1][3]=a[1][3]=a[1][3]+x[i]*y[i];
    for(int i=0; i<=k; i++)
        a0[2][3]=a[2][3]=a[2][3]+pow(x[i],2)*y[i];
    int i,j,k;
    float buf,x[3];
    //Прямой ход метода Гаусса
    for(i=0;i<n-1;i++)
    for(j=i+1;j<n;j++)
    {
        buf=a[i][i]/a[j][i];
        for(k=0;k<=n;k++) a[j][k]=a[j][k]*buf-a[i][k];
    }
    //Обратный ход метода Гаусса
    x[n-1]=a[n-1][n]/a[n-1][n-1];
    for(i=n-2;i>=0;i--)
    {
        buf=0;
        for(j=i+1;j<n;j++)
            buf+=a[i][j]*x[j];
        x[i]=(a[i][n]-buf)/a[i][i];
    }
    c0=x[0];
    c1=x[1];
    c2=x[2];
    cout<<endl<<"Решение (полином второй степени)"<<endl;
    cout<<"P2(x) = "<<x[2]<<" * x^2 + "<<x[1]<<" * x + "<<x[0]<<endl;
}
long double sko(long double* y, long double* yt, int n)
{
    long double summ=0;
    for(int k=0; k<=n-1; k++)
        summ=summ+(pow(y[k]-yt[k], 2)/(n+1)); //сумма(s)
    return sqrt(summ);
}
void main()
{
    long double h=0.1, a=0, b=1, c0, c1, c2, q=0;
    int n=(b-a)/h, k=1;
    setlocale(LC_ALL, "rus");
    long double x[11], y[11], yt[11];
    masX(x, a, h, n);
    masY(x, y, h, n, k);
    masYT(x, yt, n, k);
    for(int i=0; i<=n; i++)
        cout<<endl<<"x= "<<x[i]<<"\t"<<"y= "<<y[i]<<endl;
    approx(x, y, n, c0, c1, c2);
    q=sko(y, yt, n);
    cout<<"q= "<<q<<endl;
    k=-1;
    _getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2013, 00:56     Аппроксимация и СКО
Посмотрите здесь:

Аппроксимация С++ C++
Кусочно-линейная аппроксимация C++
C++ Кусочно-линейная аппроксимация
C++ Аппроксимация.Линейная интерполяция
Аппроксимация тригонометрическим полиномом C++
C++ Определить параметры распределения (мат.ожидание, дисперсию, СКО, коэф.корреляции)
Дан массив экспериментальных значений Х. Найти среднее и СКО C++
C++ Аппроксимация с alglib

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 01:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru