2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 метод Лобачевского-Греффе (С++)
Сообщение03.10.2012, 22:20 
Аватара пользователя
Пишу на C++ код для решения алгебраических уравнений, по методу Лобачевского-Греффе, случай действительных корней

вот в этой теме обсуждал http://dxdy.ru/topic60532.html

хочу чтоб числа из одного массива возвелись в квадрат и перешли в другой массив
почему то компилятор пишет:
Цитата:
Ошибка 1 error C2668: pow: неоднозначный вызов перегруженной функции

хватит ли типа
Код:
long long int
?

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>

using namespace std;
const int kol_chl = 5;

int main()
{
        setlocale( LC_ALL,"Russian" );

        double koef[kol_chl]={1, -35, 380, -1350, 1000};
        double st1 [kol_chl];
        double st2 [kol_chl];
        double st3 [kol_chl];
        cout << sizeof ( long long int) << endl;

        // возведение степень чисел массива koef и запись этих чисел в массив st1
        for (int i=0; i < kol_chl; i++)
        {
                st1[i]=pow(koef[i],2);
        }


        cout << koef[0] << " " << koef[1] << " " << koef[2] << " " << koef[3] << " " << koef[4] << endl;

        for (int i=0; i < kol_chl; i++)
        {
                cout << st1[i] << endl ;
        }

        system("pause");
  return 0;      
}
 


поменял тип массивов с long long int на double теперь заработало.

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение03.10.2012, 22:44 
Аватара пользователя
Sverest в сообщении #626672 писал(а):
Ошибка 1 error C2668: pow: неоднозначный вызов перегруженной функции
Эта ошибка из-за того была, что функция pow не перегружена для типа long long int:
MSDN писал(а):
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
double pow(
   double x,
   double y  
);
double pow(
   double x,
   int y
);  // C++ only
float pow(
   float x,
   float y  
);  // C++ only
float pow(
   float x,
   int y
);  // C++ only
long double pow(
   long double x,
   long double y
);  // C++ only
long double pow(
   long double x,
   int y
);  // C++ only
float powf(
   float x,
   float y  
);


 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение04.10.2012, 12:25 
Аватара пользователя
Как теперь сделать, чтоб посчиталось $-2 \cdot a_{i-1} a_{i+1}$
надо стек создавать?

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение04.10.2012, 22:00 
Sverest
Непонятно в чем проблема? В ваших обозначениях это будет примерно так
Используется синтаксис C++
for(int i=1; i<kol_chl-1; i++)
=-2*koef[i-1]*koef[i+1];

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение05.10.2012, 22:54 
Аватара пользователя
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>

using namespace std;
const int kol_chl = 5;

int main()
{
        setlocale( LC_ALL,"Russian" );
       
        double koef[kol_chl]={1, -35, 380, -1350, 1000};
        double st1 [kol_chl];
        double st2 [kol_chl];
        double st3 [kol_chl];
        double rez [kol_chl];

        int proverka= 1;
        int shetcik = 0;
       
        //зануление

        for (int i=0; i < kol_chl; i++)
        {
                st1[i]=0;
                st2[i]=0;
                st3[i]=0;
                rez[i]=0;
        }

        do {

                        // возведение степень чисел массива koef и запись этих чисел в массив st1
                        for (int i=0; i < kol_chl; i++)
                        {
                                st1[i]=pow(koef[i],2);
                        }

                        //-2 a i-1 a i+1
                        for (int i=1; i < kol_chl - 1; i++)
                        {
                                st2[i]=-2*koef[i-1]*koef[i+1];
                        }
                        //2 a i-2 a i+2
                        for (int i=2; i < kol_chl - 2; i++)
                        {
                                st3[i]=2*koef[i-2]*koef[i+2];
                        }

                        //сложение st1 st2 st3

                        for (int i=0; i < kol_chl; i++)
                        {
                                koef[i]=st1[i]+st2[i]+st3[i];
                                if (koef[i] > 10E100)
                                        proverka=0;
                        }

                shetcik = shetcik++;

        } while (proverka);


        cout << "shetcik " << shetcik << endl;
       
        //2^shetcik
        int g=2;
        for (int i=1; i < shetcik; i++)
        {
                g=g*2;
                cout << "g= " <<  g << endl;
        }
       
        double p = 1/g;
        cout << "p= " << p << endl;

        //вычисление корней
        for(int i=0; i < kol_chl; i++)
        {
                double c = koef[i+1]/koef[i];
                cout << "c" << i << "= " << c << endl ;
                rez[i]=pow(koef[i+1]/koef[i], (1/g));
                cout << "rez" << i << "= " << rez[i] << endl ;
        }
       



        // вывод koef
        cout << koef[0] << " " << koef[1] << " " << koef[2] << " " << koef[3] << " " << koef[4] << endl;

        //вывод st
        cout << "st1" << endl;

        for (int i=0; i < kol_chl; i++)
        {
                cout << st1[i] << endl ;
        }

        cout << "st2" << endl;

        for (int i=1; i < kol_chl-1; i++)
        {
                cout << st2[i] << endl ;
        }

        cout << "st3" << endl;

        for (int i=2; i < kol_chl-2; i++)
        {
                cout << st3[i] << endl ;
        }
       
        //вывод rez
        /*
        for (int i=0; i < kol_chl; i++)
        {
                cout << "rez= " << rez[i] << endl ;
        }
        */

        system("pause");
  return 0;      
}

 


В ниже написанном участке кода
переменная shetcik равна 6
g получается 64
почему тогда $p=\frac{1}{64}$ C++ пишет равным $0$, а не $0,015625$

Используется синтаксис C++
int g=2;
        for (int i=1; i < shetcik; i++)
        {
                g=g*2;
                cout << "g= " <<  g << endl;
        }
       
        double p = 1/g;
        cout << "p= " << p << endl;
 

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение05.10.2012, 23:11 
Sverest в сообщении #627413 писал(а):
почему тогда $p=\frac{1}{64}$ C++ пишет равным $0$, а не $0,015625$
Потому что при целочисленных операндах / $\text{---}$ операция целочисленного деления в C++. Вам следовало бы погрузить в воду запятую одного из операндов:
Используется синтаксис C++
double p = (double)1/g;
или
Используется синтаксис C++
double p = 1./g;
и т.п.

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 12:15 
Аватара пользователя
EtCetera в сообщении #627421 писал(а):
следовало бы погрузить в воду


Что значит погрузить в воду?

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 12:47 
Аватара пользователя
Sverest в сообщении #627527 писал(а):
Что значит погрузить в воду?
Сделать плавающей еще говорят, то бишь типом с плавающей запятой.

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 14:58 
Аватара пользователя
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>

using namespace std;
const int kol_chl = 5;

int main()
{
        setlocale( LC_ALL,"Russian" );
       
        double koef[kol_chl]={1, -35, 380, -1350, 1000};
        double st1 [kol_chl];
        double st2 [kol_chl];
        double st3 [kol_chl];
        double rez [kol_chl];

        int proverka= 1;
        int shetcik = 0;
       
        //зануление

        for (int i=0; i < kol_chl; i++)
        {
                st1[i]=0;
                st2[i]=0;
                st3[i]=0;
                rez[i]=0;
        }

        do {

                        // возведение степень чисел массива koef и запись этих чисел в массив st1
                        for (int i=0; i < kol_chl; i++)
                        {
                                st1[i]=pow(koef[i],2);
                        }

                        //-2 a i-1 a i+1
                        for (int i=1; i < kol_chl - 1; i++)
                        {
                                st2[i]=-2*koef[i-1]*koef[i+1];
                        }
                        //2 a i-2 a i+2
                        for (int i=2; i < kol_chl - 2; i++)
                        {
                                st3[i]=2*koef[i-2]*koef[i+2];
                        }

                        //сложение st1 st2 st3

                        for (int i=0; i < kol_chl; i++)
                        {
                                koef[i]=st1[i]+st2[i]+st3[i];
                                if (koef[i] > 10E100)
                                        proverka=0;
                        }

                shetcik = shetcik++;

        } while (proverka);


        cout << "shetcik " << shetcik << endl;
       
        //2^shetcik
        int g=2;
        for (int i=1; i < shetcik; i++)
        {
                g=g*2;
                cout << "g= " <<  g << endl;
        }
       
        double p = 1./g;
        cout << "p= " << p << endl;

        //вычисление корней
        for(int i=0; i < kol_chl-1; i++)
        {
                double c = (double) koef[i+1]/koef[i];
                cout << "c" << i << "= " << c << endl ;
                rez[i]=pow((double) koef[i+1]/koef[i], p );
                cout << "rez" << i << "= " << rez[i] << endl ;
        }
       



        // вывод koef
        cout << koef[0] << " " << koef[1] << " " << koef[2] << " " << koef[3] << " " << koef[4] << endl;

        //вывод st
        cout << "st1" << endl;

        for (int i=0; i < kol_chl; i++)
        {
                cout << st1[i] << endl ;
        }

        cout << "st2" << endl;

        for (int i=1; i < kol_chl-1; i++)
        {
                cout << st2[i] << endl ;
        }

        cout << "st3" << endl;

        for (int i=2; i < kol_chl-2; i++)
        {
                cout << st3[i] << endl ;
        }
       
        //вывод rez
       
        for (int i=0; i < kol_chl-1; i++)
        {
                cout << "rez= " << rez[i] << endl ;
        }
       
        system("pause");
  return 0;      
}
 


Спасибо, заработало, теперь чтоб можно было с любым уравнением работать надо динамическую память использовать? Без нее не обойтись?

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 15:18 
Аватара пользователя
Sverest в сообщении #627561 писал(а):
теперь чтоб можно было с любым уравнением работать надо динамическую память использовать? Без нее не обойтись?
Конечно, а как же без неё.

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 19:48 
Аватара пользователя
можно ли в коде реализовать вычисление $f(x_1)$?

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение06.10.2012, 22:15 
Sverest
Пусть есть многочлен $P(x)=a_0+a_1x+a_2x^2+\ldots +a_nx^n$.
Функцию, осуществляющую вычисление многочлена степени $n$ по его коэффициентам $a_i$ можно составить используя так называемую схему Горнера. Эта схема состоит в том, что многочлен переписывается в следующей форме:
$P(x)=(((0\cdot x+a_n)\cdot x+a_{n-1})\cdot x+\ldots+a_1)\cdot x+a_0$.


При таком порядке вычислений для получения значения $P(x)$ требуется лишь $n$ умножений и $n$ сложений.

Используется синтаксис C++
     //n-степень полинома, a-массив коэффициентов (размер массива n+1), x-значение
     double pol(int n, double* a, double x){
     double p=0;
     for (int i = n; i >= 0; i--)
        p = p*x + a[i];
     return p;}
 

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение08.10.2012, 19:36 
Аватара пользователя
Попробовал сделать с динамической памятью, почему то при выводе массива вылетает с ошибкой

Изображение

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>
using namespace std;


int main()
{
        setlocale( LC_ALL,"Russian" );

        int StepYr;
        cout << "Введите наибольшую степень уравнения" << endl;
        cin >> StepYr;
        StepYr=StepYr+1;

        double * dPtr_koef = new double [StepYr];

        int koff=StepYr - 1;
        for (int i = 0; i < StepYr; i++)
        {
                cout << "Введите коэффициент при x в степени:" << koff << " : " ;
                koff=koff-1;
                cin >> dPtr_koef[i];
        }

        for (int i = 0; i < StepYr; i++)
        {
                cout << dPtr_koef[i] << endl;
                delete [] dPtr_koef;
        }



        system("pause");
  return 0;      
}
 

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение08.10.2012, 19:47 
Вот это
Sverest в сообщении #628481 писал(а):
Используется синтаксис C++
delete [] dPtr_koef;
должно стоять после цикла.

 
 
 
 Re: метод Лобачевского-Греффе (С++)
Сообщение08.10.2012, 20:57 
Аватара пользователя
Спасибо, получилось, я правильно освободил память?

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <math.h>
using namespace std;


int main()
{
        setlocale( LC_ALL,"Russian" );

        int StepYr;
        cout << "Введите наибольшую степень уравнения" << endl;
        cin >> StepYr;
        StepYr=StepYr+1;

        double * dPtr_koef = new double [StepYr];
        double * dPtr_st1  = new double [StepYr];
        double * dPtr_st2  = new double [StepYr];
        double * dPtr_st3  = new double [StepYr];
        double * dPtr_rez  = new double [StepYr];

        int koff=StepYr - 1;
        for (int i = 0; i < StepYr; i++)
        {
                cout << "Введите коэффициент при x в степени:" << koff << " : " ;
                koff = koff - 1;
                cin >> dPtr_koef[i];
        }
        /*
        for (int i = 0; i < StepYr; i++)
        {
                cout << dPtr_koef[i] << endl;

        }
        */

        for (int i = 0; i < StepYr; i++)
        {

                dPtr_st1[i]=0;         
                dPtr_st2[i]=0;
                dPtr_st3[i]=0;
                dPtr_rez[i]=0;

        }

        int proverka = 1;
        int shetcik = 0;

        do {

                for (int i = 0; i < StepYr; i++)
                {
                        dPtr_st1[i] = pow (dPtr_koef[i], 2);
                }


       
// вывод
                /*for (int i = 0; i < StepYr; i++)
                {
                        cout << dPtr_st1[i] << endl;
                }*/

// st2
                for (int i = 1; i < StepYr - 1; i++)
                {
                        dPtr_st2[i] = -2 * dPtr_koef[i-1] * dPtr_koef[i+1];
                }

                for (int i=2; i < StepYr - 2; i++)
                {
                                dPtr_st3[i] = 2 * dPtr_koef[i-2] * dPtr_koef[i+2];
                }

                for (int i=0; i < StepYr; i++)
                        {
                                dPtr_koef[i] = dPtr_st1[i] + dPtr_st2[i] + dPtr_st3[i];
                                if (dPtr_koef[i] > 10E100)
                                        proverka = 0;
                        }
                        shetcik = shetcik++;
                } while (proverka);

        cout << "------------------------" << endl;
        /*     
        for (int i = 0; i < StepYr; i++)
        {
                cout << dPtr_koef[i] << endl;

        }
        */

        int g = 2;
        for (int i = 1; i < shetcik; i++)
        {
                g = g * 2;
               
        }
       
        double p = 1. / g;

        for(int i = 0; i < StepYr - 1; i++)
        {      
                dPtr_rez[i]=pow((double) dPtr_koef[i+1] / dPtr_koef[i], p);
        }

        cout << "====================" << endl;

        for (int i=0; i < StepYr - 1; i++)
        {
                cout << "rez= " << dPtr_rez[i] << endl ;
        }

                delete [] dPtr_koef;
                delete [] dPtr_st1;
                delete [] dPtr_st2;
                delete [] dPtr_st3;
                delete [] dPtr_rez;            
       
        system("pause");
  return 0;      
}

 



У меня данные выводятся в виде: 4.02063e + 079 Как можно сделать, чтоб точка была после 6й цифры

 
 
 [ Сообщений: 18 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group