19.02.2019, 19:19 [+3 UTC]
в нашей команде: 3 396 чел. | участники онлайн: 8 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.69 (10.02.2019)
JS-v.1.33 | CSS-v.3.35

Общие новости:
10.02.2019, 21:59

Форум:
16.02.2019, 15:03

Последний вопрос:
19.02.2019, 18:36
Всего: 148779

Последний ответ:
19.02.2019, 15:57
Всего: 257802

Последняя рассылка:
19.02.2019, 19:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
05.05.2011, 16:36 »
lamed
Снимаю шляпу! С уважением. [вопрос № 183055, ответ № 266986]
19.02.2010, 16:08 »
shader01
Спасибо. Неплохие варианты, в данном случае предпочтение отдаю первому варианту. [вопрос № 176757, ответ № 259562]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 682
solowey
Статус: Студент
Рейтинг: 363
zdwork
Статус: 1-й класс
Рейтинг: 111

Перейти к консультации №:
 

Консультация онлайн # 193355
Раздел: • С / С++
Автор вопроса: pNod (1-й класс)
Отправлена: 04.06.2018, 22:02
Поступило ответов: 0

Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста, разобраться, почему неправильно считает программа?
Делаю программу, которая бы считала первую производную с помощью полинома Ньютона.
На вход считывает из файла (файл во вложении): порядок полинома, интервал сетки, исходную сетку (x); значения дифференцируемой ф-ции (y); количество шагов на новой сетке, новую сетку узлов для расчета значения производной.
На выход: новая сетка (x1); значения производной функции на новой сетке.
Поскольку сетка равномерная использую формулу:

Вот программа:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<iostream>

// функция
double f(double x)
{
    double y;
    y = pow(x, 1.0 / 3.0);
    return y;
}

// функция расчета конечных разностей
double *ComputationDeltaY(double *y,int N)
{
    double *deltaY,*tempDeltaY;
    deltaY = new double[N+1];
    tempDeltaY = new double[N+1];
    deltaY[0]=y[0];
    for(int i=0;i<N+1;i++)
    {
        tempDeltaY[i]=y[i]; // массив Y теперь в массиве tempDeltaY
    }
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N-i;j++)
        {
            tempDeltaY[j]=tempDeltaY[j+1]-tempDeltaY[j]; // разница между Y
        }
        deltaY[i]=tempDeltaY[0];
    }
    delete[] tempDeltaY;
    return deltaY;
}

// функция расчета факториала
double Factorial(int a)
{
    double Fact=1;
    for(int i=1;i<=a;i++)
    {
        Fact *= i;
    }
    return Fact;
}

// функция вычисления первой производной
double *PP(double *x1,double *y,int N,int M,double a,double b)
{
    double *y1,h,*delta,sum,q;
    y1 = new double[M+1];
    h = (b - a)/N;
    delta = ComputationDeltaY(y,N);
    for(int i=0;i<M+1;i++)
    {
        sum=0;
        q = (x1[i]-a)/h;
        for(int j=1;j<N+1;j++)
        {
            double MultiSum=0;
            for(int k=0;k<=j-1;k++)
            {
                double multi=1;
                for(int l=0;l<=j-1;l++)
                {
                    if(k!=l)
                    {
                        multi *= q - l;
                    }
                }
                MultiSum += multi/h;
            }
            sum += (double) (1.0/Factorial(j))*delta[j-1]*MultiSum;
        }
        y1[i]=sum;
    }
    delete[] delta;
    return y1;
}

int main(){
    setlocale(LC_CTYPE,"Russian");
	int M, N, k, i; // вспомогательные переменные
	// переменные для массивов узлов, значений функций и шага
	double	a, b, *x, *y, *x1, *y1;

    FILE *f1;
    if((f1=fopen("input.txt","rt"))==NULL)
    {
        printf("Файл не открывается!\n");
        exit(1);
    }

    x = new double[N+1];
    y = new double[N+1];
    fscanf(f1,"%d",&N); // порядок полинома
    fscanf(f1,"%lf",&a); // начало интервала
    fscanf(f1,"%lf",&b); // конец интервала
    for (int i=0;i<N+1;i++)
    {
        fscanf(f1,"%lf",&x[i]); // x
    }
    for(int i=0;i<N+1;i++)
    {
        fscanf(f1,"%lf",&y[i]); // y
    }
    fscanf(f1,"%d",&M); // количество шагов по новой сетке
    x1 = new double[M+1];
    for (int i=0;i<M+1;i++)
    {
        fscanf(f1,"%lf",&x1[i]); // новый x
    }

    y1 = PP(x1,y,N,M,a,b);
    for (int i=0;i<M+1;i++)
    {
        printf("y'(%d)=%.4f\n",i,y1[i]);
    }
    fclose(f1);

delete[] y1;
delete[] y;
delete[] x1;
delete[] x;


return 0;
}



Она считает, но неправильно... smile


Последнее редактирование 05.06.2018, 20:50 Зенченко Константин Николаевич (Старший модератор)

-----
 Прикрепленный файл: скачать (TXT) » [320 байт]

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 193355
pNod
1-й класс

ID: 401172

# 1

= общий = | 04.06.2018, 22:08 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Через тег изображения не получается добавить формулу, прикрепляю файлом.

-----
 Прикрепленный файл (кликните по картинке для увеличения):

pNod
1-й класс

ID: 401172

# 2

= общий = | 05.06.2018, 14:52 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата:
Вы вводите N после того, как выделяете память под массивы x и y размера N+1


Да уж, не досмотрела smile , спасибо, исправила, сто раз все переделывала, глаз уже замылился.
К сожалению, на результат это не повлияло.

Гордиенко Андрей Владимирович
Мастер-Эксперт

ID: 17387

# 3

 +1 
 
= общий = | 05.06.2018, 18:28 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mklokov:

Если перенести Ваш ответ в мини-форум консультации, то у Вас не будет возможности сделать правильный ответ, потому что прежний придётся удалить. Пока есть время, попробуйте решить проблему.

=====
Facta loquuntur.

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 4

= общий = | 05.06.2018, 20:36 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
mklokov:

Уточняйте свой ответ, заменим.

-----
Последнее редактирование 05.06.2018, 20:53 Зенченко Константин Николаевич (Старший модератор)

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 5

= общий = | 05.06.2018, 20:39 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата: mklokov
Первое, что бросается в глаза: Вы вводите N после того, как выделяете память под массивы x и y размера N+1

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 6

= общий = | 05.06.2018, 20:53 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
pNod:

© Цитата: pNod
спасибо, исправила,

Выложите исправленный вариант в минифоруме, чтобы другие эксперты, уже знали о последней Вашей версии.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

pNod
1-й класс

ID: 401172

# 7

= общий = | 05.06.2018, 21:08 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<iostream>

// функция расчета конечных разностей
double *ComputationDeltaY(double *y,int N)
{
    double *deltaY,*tempDeltaY;
    deltaY = new double[N+1];
    tempDeltaY = new double[N+1];
    deltaY[0]=y[0];
    for(int i=0;i<N+1;i++)
    {
        tempDeltaY[i]=y[i]; // массив Y теперь в массиве tempDeltaY
    }
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N-i;j++)
        {
            tempDeltaY[j]=tempDeltaY[j+1]-tempDeltaY[j]; // разница между Y
        }
        deltaY[i]=tempDeltaY[0];
    }
    delete[] tempDeltaY;
    return deltaY;
}

// функция расчета факториала
double Factorial(int a)
{
    double Fact=1;
    for(int i=1;i<=a;i++)
    {
        Fact *= i;
    }
    return Fact;
}

// функция вычисления первой производной
double *PP(double *x1,double *y,int N,int M,double a,double b)
{
    double *y1,h,*delta,sum,q;
    y1 = new double[M+1];
    h = (b - a)/N;
    delta = ComputationDeltaY(y,N);
    for(int i=0;i<M+1;i++)
    {
        sum=0;
        q = (x1[i]-a)/h;
        for(int j=1;j<N+1;j++)
        {
            double MultiSum=0;
            for(int k=0;k<=j-1;k++)
            {
                double multi=1;
                for(int l=0;l<=j-1;l++)
                {
                    if(k!=l)
                    {
                        multi *= q - l;
                    }
                }
                MultiSum += multi/h;
            }
            sum += (double) (1.0/Factorial(j))*delta[j-1]*MultiSum;
        }
        y1[i]=sum;
    }
    delete[] delta;
    return y1;
}

int main(){
    setlocale(LC_CTYPE,"Russian");
	int M, N; // вспомогательные переменные
	// переменные для массивов узлов, значений функций и шага
	double	a, b, *x, *y, *x1, *y1;

    FILE *f1;
    if((f1=fopen("input.txt","rt"))==NULL)
    {
        printf("Файл не открывается!\n");
        exit(1);
    }
    fscanf(f1,"%d",&N); // порядок полинома
    x = new double[N+1];
    y = new double[N+1];

    fscanf(f1,"%lf",&a); // начало интервала
    fscanf(f1,"%lf",&b); // конец интервала
    for (int i=0;i<N+1;i++)
    {
        fscanf(f1,"%lf",&x[i]); // x
    }
    for(int i=0;i<N+1;i++)
    {
        fscanf(f1,"%lf",&y[i]); // y
    }
    fscanf(f1,"%d",&M); // количество шагов по новой сетке
    x1 = new double[M+1];
    for (int i=0;i<M+1;i++)
    {
        fscanf(f1,"%lf",&x1[i]); // новый x
    }

    if((f2=fopen("out.txt","w"))==NULL)
    {
        printf("Файл не открывается!\n");
        exit(1);
    }

    y1 = PP(x1,y,N,M,a,b);
    for (int i=0;i<M+1;i++)
    {
        printf("y'(%d)=%.4f\n",i,y1[i]);
    }
    fclose(f1);

delete[] y1;
delete[] y;
delete[] x1;
delete[] x;

return 0;
}

 

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

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.16666 сек.

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.69 от 10.02.2019
Версия JS: 1.33 | Версия CSS: 3.35