Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Интерполяционная Ф-ла Ньютона

52K
27 марта 2012 года
Пав
11 / / 17.12.2009
Вторая интерполяционная формула Ньютона
Уважаемые форумчане
взгляните пожалуйста на творение и дайте пару советов по оптимизации
данного кода желательно наглядно))

Вычислить значение для 550 с помощью второй интер.ф-лы.Ньютона
Таблица 1
x 300 400 500 600
Y 52.88 65.61 78.07 99.24



Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <math.h>
using namespace std;
int factorial (int f);
 
int   main ()
{
        setlocale(LC_CTYPE,"Russian");
       
                        float X[]={ 300,400,500,600 };
                        float Y[]={52.88,65.61,78.07,99.24};
                       
                        int n=3;
 
       
                        float testX;
                        cout<<"Вводим проверяемый Х\n";
                        cin>>testX;
                        if(testX>X[3]||testX<X[0])
                        {cout<<"Недопустимое значение\n";return 0;}
 
 
                float ** razn= new float *[n+n+1]; /*создание динамического массива для таблицы конечных разностей
                                                                                  [n+n+1]столько у нас строк в таблице*/

        int k=0;
        for (int i=0;i<=n;++i)
        {
                razn[i] = new float [n+1+k];
                --k;// выделяем память для каждой строки определенное кол столбцов [n+n+1+k]
                //к- уменьшает число столбцов в строчке на 1, т.к.
                //таблица разностей имеет диагональный вид
        }
        for ( int i=0;i<=n;++i)// заполняем нулевой столбец массива значениями функции в узлах
        {
                razn [i][0]=Y[i];
                cout<<razn[i][0]<<" "<<endl;
        }
        cout<<endl<<"----------------"<<endl;
        int r=n;
 
        for (int j=1;j<=n+n;++j)
        {
                for(int i=0;i<r;++i)
                {
                        int s=-i;
                        razn[i][j]=razn[-(s-1)][j-1]-razn[i][j-1];//получаем таблицу разностей
                        cout<<"r[ "<<i<<"][ "<<j<<"]"<<razn[i][j]<<" "<<endl;
                }
                cout<<endl<<"----------------"<<endl;
                r--;//это чтобы уменьшать число столбцов, в строке, приводить к диагональному виду таблицу разности
               if(r==0)break;
        }
 
float sum,sum1,sum3,sum2;
float st=X[1]-X[0];
 
float *q = new float;
float tmp=1;
 
sum=Y[n];int p=1,u=n;
for(int i=0;i<=n;i++)
 
        {
                        q[i]=(testX-X[u]);
                        tmp*=q[i];
                        sum1=razn[u-1][i+1]*tmp;
                        sum2=pow(st,p)*factorial(p);
                        sum3=sum1/sum2;
                        sum=sum+sum3;
                        cout<<"sum= "<<sum<<"\n";
                        p++;u--;
                        if(u-1<0)break;//чтобы не выйти за границы таблицы конечн.разностей
        }      
 
        cout<<"Результата вычислений Р("<<testX<<")= "<<sum<<endl;
        return 0;
}
       
int factorial (int f)
{
int product = 1;
while (f> 0) {product = f *product;f--;}
return product;
}
316
27 марта 2012 года
Alm3n
889 / / 29.05.2009
Код:
for (int i=0;i<=n;++i)
         {
                 razn[i] = new float [n+1+k];
                 --k;// выделяем память для каждой строки определенное кол столбцов [n+n+1+k]
                 //к- уменьшает число столбцов в строчке на 1, т.к.
                 //таблица разностей имеет диагональный вид
         }
         for ( int i=0;i<=n;++i)// заполняем нулевой столбец массива значениями функции в узлах
         {
                 razn [i][0]=Y[i];
                 cout<<razn[i][0]<<" "<<endl;
         }
Можно объединить в один цикл.
52K
27 марта 2012 года
Пав
11 / / 17.12.2009
как бы вот это получше выразить??
Код:
{
                        q[i]=(testX-X[u]);
                        tmp*=q[i];
                        sum1=razn[u-1][i+1]*tmp;
                        sum2=pow(st,p)*factorial(p);
                        sum3=sum1/sum2;
                        sum=sum+sum3;
                        cout<<"sum= "<<sum<<"\n";
                        p++;u--;
                        if(u-1<0)break;//чтобы не выйти за границы таблицы конечн.разностей
        }
78K
30 марта 2012 года
drfaust
20 / / 19.03.2012
имеет смысл "развернуть" факториал:
Код:
//новое
long unsigned fact=1;
{
                        q[i]=(testX-X[u]);
                        tmp*=q[i];
                        sum1=razn[u-1][i+1]*tmp;
                        //старое
                        //sum2=pow(st,p)*factorial(p);
                        //новое
                         sum2=pow(st,p)*fact;
                        sum3=sum1/sum2;
                        sum=sum+sum3;
                        cout<<"sum= "<<sum<<"\n";
                        p++;
//новое
                        fact=fact*p;

                        u--;
                        if(u-1<0)break;//чтобы не выйти за границы таблицы конечн.разностей
        }
При этом можно выкинуть функцию факториала. Кроме того при подсчёте факториала экономится порядка (n-1) умножений на каждом вызове ненужной функции.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог