Форум программистов, компьютерный форум CyberForum.ru

Составить таблицу значений - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Baksik
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 11
24.03.2012, 11:19     Составить таблицу значений #1
Нужно составить таблицу значений на отрезке [a, b] с шагом h
построю график я в другой программе..
Миниатюры
Составить таблицу значений  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
24.03.2012, 11:38     Составить таблицу значений #2
C11 и С12 это константы?
Baksik
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 11
24.03.2012, 14:44  [ТС]     Составить таблицу значений #3
Цитата Сообщение от Toshkarik Посмотреть сообщение
C11 и С12 это константы?
Ну в задании не написано что это такое, я когда пробывал делать тож подумал что это константы...
-=ЮрА=-
24.03.2012, 15:11
  #4

Не по теме:

Да какие же это константы - это число сочетаний из 11 по k и из 22 по 10-k

Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.03.2012, 15:32     Составить таблицу значений #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <math.h>
#include <stdio.h>
#include <conio.h>
long fakt(int n) {
    long temp=1;
    for (int i=0;i<n;i++) temp*=i+1;
    return temp;
}
 
double C (int n,int k) {
       return (fakt(n)*1.0/(fakt(k)*fakt(n-k)));
}
 
const double a=0.5;
const double b=1.0;
const double h=0.05;
 
double F (double x) {
       double sum=0;
       for (int k=0;k<11;k++) 
           sum+=C(11,k)*C(12,10-k)*pow(x-1,10-k)*pow(x+1,k);
       sum*=pow(2,-10);
       return sum;
}
int main()
{
    double t=a;
    while (t<=b) {
          printf("%9.9lf %9.9lf\n",t,F(t));
          t+=h;
          }
    getch();
    return 0;      
}
Хз правильно ли считает
-=ЮрА=-
24.03.2012, 16:23
  #6

Не по теме:

Baksik, чему равно k в формулах?Есть ли какое либо условие именно для него???

Baksik
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 11
24.03.2012, 17:09  [ТС]     Составить таблицу значений #7
В условие ничего не сказано
просто сказано составить таблицу значений и построить график на отрезке от а до b с шагом h для данной функции
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
24.03.2012, 17:56     Составить таблицу значений #8
-=ЮрА=-, по-моему по формуле k принимает значение от 0 до 10 во время суммирования.

Добавлено через 41 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <iomanip>
#include <cmath>
 
/*
 *
 */
 
long double fact( unsigned long int num ) {
    long double factorial = 1;
 
    for ( unsigned long int i = num; i > 0; i-- )
        factorial *= i;
 
    return factorial;
}
 
long double Cnum( int n, int k ) {
    return fact( n ) / ( fact( k ) * fact( n - k ));
}
 
double func( double x ) {
    double sum = 0;
 
    for ( int k = 0; k <= 10; k++ )
        sum += ( Cnum( 11, k ) * Cnum( 12, 10 - k ) * std::pow(( x - 1 ), 10 - k ) * std::pow(( x + 1 ), k ));
 
    sum *= std::pow( 2., -10 );
 
    return sum;
}
 
int main() {
    double a = 0, b = 5, h = .1;
 
    for ( double i = a; i <= b; i += h )
        std::cout << "function( " << i << " ) = " << std::fixed << std::setprecision( 6 ) << func( i ) << std::endl;
 
    return 0;
}
В лоб так сказать, я не знаю на сколько это правильно\неправильно. Нужно почитать про числа сочетаний, все забыл, если б Юра не сказал я бы и не вспомнил.
-=ЮрА=-
24.03.2012, 22:10
  #9

Не по теме:

Baksik, приблизив формулу я увидел что к изменяется от 0 до 10, скоро выложу код, уже в разработке...

-=ЮрА=-
Заблокирован
Автор FAQ
25.03.2012, 09:43     Составить таблицу значений #10
Baksik, первый мой вариант мало чем отличается от здесь предложенных(я приведу и провинутый вариант).
Для начала небольшая теоретическая справка
В комбинаторике сочетанием из n по k называется набор k элементов, выбранных из данных n элементов. Обозначается сочетание буквой С с соответствующими индексами.
Число сочетаний рассчитывается согласно выражению http://www.cyberforum.ru/cgi-bin/latex.cgi?{{C}^{k}}_{n} = \frac{n!}{k!\cdot (n - k)!}Ниже код на С++ обеспечивающий прямолинейную логику формулы(т.е. как роботы считаем по формулам и ничего более)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cmath>
using namespace std;
 
unsigned long factorial(unsigned long m)
{
    unsigned long fact = (m == 0 ? 1 : m);
    if(0 < m)
        fact *= factorial(m - 1);
    return fact;
}
 
unsigned long C(unsigned long n, unsigned long k)
{
    //(n - k < 0) ? 0 : value - такая запись єквивалентна этой
    //if(n - k < 0)
    //  c = 0;
    //else
    //  c = value;
    //Мы не можем находить число сочетаний по k элементов больше чем n
    double c = (n - k < 0) ? 0 : factorial(n)/(1.0*factorial(k)*factorial(n - k));
    return c;
}
 
double F(double x)
{
    double sum = 0;
    for(unsigned long k = 0; k <= 10; k++)
        sum += C(11, k)*C(12,10 - k)*pow((x - 1),10.0 - k)*pow(x + 1,1.0*k);
    return pow(2,-10.0)*sum;
}
 
int main()
{
    double x, a, b, h;
    while(true)
    {
        cout<<"Enter a : ";cin>>a;
        cout<<"Enter b : ";cin>>b;
        cout<<"Enter h : ";cin>>h;
        cout<<"  x\t  F(x)\n";
        for(x = a; x < b + h; x += h)
            cout<<x<<"\t"<<F(x)<<endl;
    }
    return 0;
}
На рисунке скриншот проверки результатов вычислений в MathCAD-е, как видим всё хорошо считается
Миниатюры
Составить таблицу значений  
-=ЮрА=-
Заблокирован
Автор FAQ
25.03.2012, 11:03     Составить таблицу значений #11
Теперь предлагаю установить во сколько раз отличаются друг от друга смежные сочетания
http://www.cyberforum.ru/cgi-bin/latex.cgi?{{C}^{k}}_{n} = \frac{n!}{k!\cdot (n - k)!}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{{C}^{k + 1}}_{n} = \frac{n!}{(k + 1)!\cdot (n - (k + 1))!}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{{C}^{k + 1}}_{n} = \frac{n!}{k!*(k + 1)\cdot (n - k - 1)!}
Таким образом наше соотношение составит
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{{C}^{k + 1}}_{n}}{{{C}^{k}}_{n}} = \frac{\frac{n!}{k!(k + 1)\cdot (n - k - 1)!} }{\frac{n!}{k!\cdot (n - k)!}}
Преобразуя далее получаем следующее рекуррентное соотношение для числа сочетаний
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{{C}^{k + 1}}_{n}}{{{C}^{k}}_{n}} = \frac{(n - k)!}{(k + 1)*(n - k - 1)!} = \frac{(n - k)\cdot (n - k)!}{(k + 1)*(n - k)!} = \frac{n - k}{k + 1}

Используя приведенное выше рекуррентное соотношение, можно считать число сочетаний минимум в (n - 1)! раз эффективней нежели по прямой формуле(оно и не удивительно - для обчного вычисления числа сочетаний по формуле нам нужно посчитать 3 факториала, в формуле F(x) 2 сочетания, т.е. на каждой итерации приходиться считать 6-ть факториалов - это ужасаюая нерациональность!То ли дела простецкий цикл
for(unsigned long i = 0 ; i < k; i++)
c *= (n - i)/(1.0*(i + 1)); который выолняет в (k - 1)! меньше итераций, думаю не стоит объяснять сколько это по времени при заоблачных величинах k)
Ниже прелагаю продвинутый алгоритм (продвинутый в плане нахождения числа сочетаний)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cmath>
using namespace std;
 
double C(unsigned long n, unsigned long k)
{
    double c = (n - k < 0) ?  0 : 1;//1 - это С из n по 0
    for(unsigned long i = 0   ; i < k; i++)
        c *= (n - i)/(1.0*(i + 1));
    return c;
}
 
double F(double x)
{
    double sum = 0;
    for(unsigned long k = 0; k <= 10; k++)
        sum += C(11, k)*C(12,10 - k)*pow((x - 1),10 - k)*pow(x + 1,k);
    return pow(2,-10.0)*sum;
}
 
int main()
{
    double x, a, b, h;
    while(true)
    {
        cout<<"Enter a : ";cin>>a;
        cout<<"Enter b : ";cin>>b;
        cout<<"Enter h : ";cin>>h;
        cout<<"  x\t  F(x)\n";
        for(x = a; x < b + h; x += h)
            cout<<x<<"\t"<<F(x)<<endl;
    }
    return 0;
}
Миниатюры
Составить таблицу значений  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2012, 00:29     Составить таблицу значений
Еще ссылки по теме:

C++ Вывод значений в таблицу
Составить программу, которая рассчитывает таблицу значений функции tgx, через ряд Тейлора C++
Составить таблицу значений функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Baksik
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 11
13.04.2012, 00:29  [ТС]     Составить таблицу значений #12
а можете подсказать какую формулу мне нужно вставить в столбец y, для построения данного графика в экселе...?
Yandex
Объявления
13.04.2012, 00:29     Составить таблицу значений
Ответ Создать тему
Опции темы

Текущее время: 23:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru