18.08.2018, 10:12 [+3 UTC]
в нашей команде: 2 915 чел. | участники онлайн: 3 (рекорд: 21)

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

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

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

:: правила

:: новости

:: участники

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

:: форум

:: блоги

:: поиск

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

:: наш журнал

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

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

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

:: поддержка

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

Версия системы:
7.47 (16.04.2018)

Общие новости:
13.04.2018, 10:33

Форум:
16.08.2018, 11:45

Последний вопрос:
17.08.2018, 14:32

Последний ответ:
12.08.2018, 20:20

Последняя рассылка:
18.08.2018, 00:45

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

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

Наша кнопка:

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

Отзывы о нас:
01.08.2010, 20:11 »
Dimon4ik
Спасибо. Драйвер удалось откатить на старый. Тот действительно был не рабочий. DirectX установил с диска с игрой. Но там видимо не та версия. Сейчас качаю DirectX 9.0с - 104 МБ. Установлю и посмотрим. Спасибо за ответ. smile [вопрос № 179640, ответ № 262710]
14.12.2010, 21:22 »
Юлия Назаренко
Спасибо за своевременный ответ и квалифицированную помощь. Вы мне очень помогли! [вопрос № 181279, ответ № 264711]
09.07.2010, 11:55 »
Dipauler
Спасибо за ответ. Оцениваю на "4", потому что для "5" нужно совместить Ваш ответ с ответом FOXhunter в мини-форуме вопроса. [вопрос № 179450, ответ № 262474]

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

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

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

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

CradleA
Статус: Профессор
Рейтинг: 67
solowey
Статус: Студент
Рейтинг: 65
mklokov
Статус: 6-й класс
Рейтинг: 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.14538 сек.

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