18.10.2018, 09:23 [+3 UTC]
в нашей команде: 3 015 чел. | участники онлайн: 4 (рекорд: 21)

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

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

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.51 (29.09.2018)

Общие новости:
24.09.2018, 16:49

Форум:
14.10.2018, 19:20

Последний вопрос:
18.10.2018, 02:57

Последний ответ:
18.10.2018, 08:14

Последняя рассылка:
17.10.2018, 23:45

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

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

Наша кнопка:

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

Отзывы о нас:
19.09.2009, 07:58 »
Rem88-72
Спасибо за четко сформулированный ответ! [вопрос № 172285, ответ № 254333]
12.11.2009, 08:01 »
jeck26
Огромное спасибо за ответ! Сначала буду искать недорогой привод. Если не найду, куплю внешний USB 2.0 за 2 т. р. [вопрос № 174133, ответ № 256379]

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

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

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

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

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 124
solowey
Статус: Студент
Рейтинг: 72
Андрей Кузнецов aka Dr_Andrew
Статус: Старший модератор
Рейтинг: 24

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

Консультация онлайн # 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


исправлен размер тега CODE, добавлено изобразение формулы
--------

• Отредактировал: Зенченко Константин Николаевич (Модератор)
• Дата редактирования: 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:

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

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

• Отредактировал: Зенченко Константин Николаевич (Модератор)
• Дата редактирования: 05.06.2018, 20:53

Зенченко Константин Николаевич
Модератор

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.18241 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.51 от 29.09.2018