0 / 0 / 0
Регистрация: 15.10.2017
Сообщений: 7
1

Построение кубического сплайна

14.10.2018, 10:53. Показов 2875. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь пофиксить этот написанный мною код для построения кубического сплайна уже второй день. Не получается. Первая проблема - в функции main программа неправильно считает элементы массива F. Например, при вводе S[i]=i+1,(i=0,..,5) n=5 программа выдает F[2]=12, хотя F[2]=3*(S[3]-S[2])=3*(4-3)=3. Вторая проблема - после высчитывания элементов массивов A,B,C,F, программа крашится. Видимо - проблема в функции progonka (метод прогонки для трехдиаг матриц). ПО содержанию ничего не прошу комментировать, только если глаз зацепит какие-то формальные ошибки, буду очень благодарен. Сначала я в коде вместо cout и cin в начале писал printf и scanf соотве-но, но было очень много проблем с форматами, и я их заменил. (однако, как я и говорил, считает все равно непрвильно). Компилируется код в CodeBlocks C++ без ошибок и предупреждений.
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
104
105
106
107
108
109
110
111
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
using namespace std;
 
void progonka (double A[], double C[], double B[], double F[], double X[],int n)
{
    int i;
    double alpha[n],beta[n];
    alpha[2]=B[1]/C[1]*(-1);
    beta[2]=F[1]/C[1];
    for (i=2;i<=n-1;i++)
    {
        alpha[i+1]=(-B[i])/(A[i]*alpha[i]+C[i]);
        beta[i+1]=(F[i]-A[i]*beta[i])/(A[i]*alpha[i]+C[i]);
 
    }
    X[n]=(F[n]-A[n]*beta[n])/(C[n]+A[n]*alpha[n]);
    for (i=n-1;i>=1;i--)
    {
        X[i]=alpha[i+1]*X[i+1]+beta[i+1];
 
    }
 
 
 
}
 
int main()
{
    double a,b;
 
    int n,i;
    double S[n],diff20,diff1n;
    printf("vvedite konci otrezka i kolicestvo intervalov\n");
    std::cin>> a;
    std::cin>> b;
    std::cin>> n;
    printf("vvedite zna4enie vtoroi proizvodnoi v to4ke x0\n");
    std::cin>> diff20;
    printf("vvedite zna4enie pervoi proizvodnoi v to4ke xn\n");
    std::cin>> diff1n;
 
    double h=(b-a)/n;
    printf("%f\n", h);
    printf("vvedite %i znaceniy v uzlax\n", n+1 );
    for (i=0;i<=n;i++)
    {
        std::cin>> S[i];
    }
    for (i=0;i<=n;i++)
    {
        std::cout<< S[i];
        std::cout<<"\n";
    }
    double F[n-2],A[n-2],B[n-2],C[n-2],X[n-2];
    for (i=1;i<=n-2;i++)
    {
        F[i]=3*(S[i+1]-S[i]);
    }
    
    A[1]=0;
    B[n-2]=0;
    C[1]=double(4+0.5)*h;
    printf("%f\n",C[1]);
 
    F[1]=F[1]-(h*diff20)/double(4);
    F[n-2]=F[n-2]-(3*(diff1n*h-S[n]+S[n-1])/h)/2;
    C[n-2]=double(4-0.5)*h;
    A[n-2]=h;
    B[1]=h;
    for (i=2;i<=n-3;i++)
    {
        A[i]=h;
        C[i]=4*h;
        B[i]=h;
    }
 
    for (i=1;i<=n-2;i++)
    {
        printf("%f %f %f %f\n", A[i],C[i],B[i],F[i]);
    }
    progonka(A,C,B,F,X,n-2);
    double thirdcoeff[n];
    thirdcoeff[1]=(diff20+2*X[1])/4;
    thirdcoeff[n]=((3*(diff1n*h-S[n]+S[n-1])/(h*h))-X[n-2])/2;
    for (i=2;i<=n-1;i++)
    {
        thirdcoeff[i]=X[i-1];
    }
    thirdcoeff[0]=0;
    double firstcoeff[n],secondcoeff[n],fourthcoeff[n];
    for (i=1;i<=n;i++)
    {
        firstcoeff[i]=S[i];
 
        secondcoeff[i]=(S[i]-S[i-1])/h+(2*thirdcoeff[i]-thirdcoeff[i-1])*h/3;
        fourthcoeff[i]=(thirdcoeff[i+1]-thirdcoeff[i])/(3*h);
    }
    FILE *spline;
    spline = fopen("spline.csv", "w");// вместо даблю а
    for (i=1; i<=n; i++)
    {
        fprintf (spline, "%f;%f;%f;%f\n", firstcoeff[i], secondcoeff[i],thirdcoeff[i],fourthcoeff[i]);
    }
 
    fclose (spline);
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2018, 10:53
Ответы с готовыми решениями:

Численные методы, построение кубического сплайна
Уважаемые форумчане, Уже два месяца идёт непонятный предмет, объясняемый непонятным языком. Дана...

Построение кубического сплайна (БЕЗ применения стандартных функций). Автоматизировать составлений условий
Здравствуйте! Вообщем, в MathCAD-е реализовал составление кубического интерполяционного сплайна,...

Экстраполяция кубического сплайна.
По данным построил кубическую сплайн-интреполяцию и поведение ее производной ,помогите пожалуйста...

Код вычисления коэффициентов кубического сплайна.
Мне нужен код вычисления коэффициентов кубического сплайна. Может кто-то знает, где его достать?

2
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,700
14.10.2018, 11:00 2
Лучший ответ Сообщение было отмечено hotnakedgirl как решение

Решение

Цитата Сообщение от hotnakedgirl Посмотреть сообщение
C++
1
2
int n,i; 
double S[n],diff20,diff1n;
Переменной n значение не присвоено.
Поэтому
1. массив S[n] имеет неизвестный размер.
2. для массивов переменной длины надо выделять память динамически
C++
1
2
3
4
5
int n;
cin>>n;
double *S=new double[n];
.... использование массива
delete[] S;// освобождение памяти
1
0 / 0 / 0
Регистрация: 15.10.2017
Сообщений: 7
14.10.2018, 11:13  [ТС] 3
Спасибо! Теперь считается нормально и не крашится!
0
14.10.2018, 11:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2018, 11:13
Помогаю со студенческими работами здесь

Каким образом определять касательные кубического сплайна?
Здравствуйте. На основе формулы можно построить сегмент кривой через две точки и касательные....

Обеспечить совпадение на четырех точках кубического сплайна и полинома Ньютона
Здравствуйте. Подскажите, как можно обеспечить совпадение на четырех точках кубического сплайна и...

Построение сплайна по координатам точек из таблицы Excel
Здравствуйте! Имеется 2 столбца с координатами Х и Y точек. Необходимо построить сплайн по этим...

Построение интерполяционного кубического сплаина
Доброго времени суток, мучаюсь с этой лабораторной уже не первый день, решил наконец попросить...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru