Лекции по "Высшая математика"

Автор: Пользователь скрыл имя, 22 Декабря 2011 в 20:19, курс лекций

Описание работы

Под табуляцией функции понимается вычисление значений функции в зависимости от аргумента, который меняется в определенных пределах с постоянным шагом. Решение задачи табуляции является достаточно характерным примером реализации циклического алгоритма.

Содержание

1. Табуляция функции 4
1.1. Практические задания 6
2. Методы нахождения корней уравнений 8
2.1. Метод половинного деления 8
2.2. Итерационные методы 10
2.3. Практические задания 15
3. Вычисление определенного интеграла 16
3.1. Практические задания 19
4. Вычисление конечных сумм 20
4.1. Практические задания 24
5. Индексированные переменные 26
5.1. Одномерный массив 26
5.2. Практические задания 30
5.3. Двумерный массив 32
5.4. Практические задания 38
6. Решение системы линейных алгебраических
уравнений методом Гаусса 41
6.1. Практические задания 44
Литература 46

Работа содержит 1 файл

Методички 1 курс.doc

— 678.00 Кб (Скачать)
tify">  const int Ni = 5, Nj = 10;

  int  i,j;

  double a[Ni][Nj]; 

  printf("вводим  массив a\n");

  /* Напоминание: индексация в массивах 

  ВСЕГДА  начинается с 0   */

  for (i=0; i< Ni; i++)

  for (j=0;j< Nj; j++)

  {

  printf("a[ %d , %d ]=", i,j);

  scanf("%lf",&a[i][j]);

  }

  printf("Ввод  массива окончен \n"); 

  printf("Вывод массива\n");

  for (i=0; i< Ni; i++)

  for (j=0;j< Nj; j++)

  printf("a[ %d , %d ]=%lf \n", i, j, a[i][j]);

  return 0;

  }

  Несмотря  на простоту приведенной программы, отметим, что внутренние или вложенные  циклы по переменной j выполняются без остановок, тогда как внешние циклы по i "дожидаются" очередного окончания своего внутреннего цикла. Иными словами, сначала значение i становится равным 1, затем j "пробегает" значения от 1 до Nj, затем i становится равным 2 и вновь j "пробегает" значения от 1 до Nj, далее i уже равняется 3 и т.д.

  Здесь следует отметить бросающуюся в  глаза "негибкость" такого способа  работы с массивами, для которых  заранее неизвестно число элементов (их размер или "глубина") по любой  из размерностей массива. Иными словами, идентификаторы Ni и Nj не могут быть переменными, значения которых можно вводить с клавиатуры (как, например, значения элементов массива) во время исполнения программы.

  Отметим также, что отладка программы, использующей приведенную выше программу, будет, скорее всего, неудобной. При запуске такой программы от вас потребуется не унывать, когда после очередного ввода 50-ти чисел вы обнаружите, что остальная часть программы работает неверно. Поэтому при отладке программ рекомендуется другой способ ввода массива. Он называется начальной инициализацией массива. Для этого в отлаживаемой программе при объявлении массива можно сразу задать начальные значения его элементов: 

            const int Ni = 5, Nj = 10;

  double a[Ni][Nj]=

  {{0.1, 0.5, 1.1, 1.5, 3.3, 0.1, 0.2, 8.9, 0.9, 1.0},

   {3.3, 6.1, 8.8, 3.7, 4.1, 9.1, 1.1, 5.2, 8.8, 4.1},

   {4.4, 6.5, 1.7, 3.6, 2.6, 5.9, 4.8, 2.7, 8.7, 2.0},

   {8.1, 3.2, 2.1, 9.1, 4.4, 7.7, 5.2, 1.9, 3.6, 5.9},

   {5.8, 8.2, 5.2, 7.4, 9.5, 0.8, 4.2, 2.4, 6.9, 8.0}}; 

    В этом случае, начальными значениями элементов объявленного массива будут не произвольные числа, а числа, заключенные между фигурными скобками. Например, первое число в первой строчке заносится в элемент a[0,0], второе - в a[0,1], последнее в a[0,9], первое число во второй строке - в a[1,0] и т.д.

Примеры программ с использованием двумерных массивов

  Задача 1. Дана квадратная матрица A. Написать программу, которая вычисляет сумму всех элементов матрицы A и сумму ее элементов, расположенных на главной диагонали. 

        -1   23   14   -34
        52   38   -65   47
        29   53   -29   -8
        13   -54   17   55
 

  #include <stdio.h>

  #include <stdlib.h> 

  int main()

  { 

  const int N = 4;

  int A[N][N] = {{ -1, 23, 14,-34},

                           { 52, 38,-65, 47},

                           { 29, 53,-29, -8},

                            { 13,-54, 17, 55}};

  int  Diag_Sum, All_Sum, i,j;

   All_Sum= 0;

   Diag_Sum= 0;

   for(i=0; i<N; i++)

       for( j=0; j< N; j++)

            {

              All_Sum = All_Sum + A[i][j];

              if (i==j) Diag_Sum = Diag_Sum + A[i][j];

            }

  printf("Сумма элементов матрицы = %d \n",All_Sum);

  printf("Сумма  элементов главной диагонали  = %d \n", Diag_Sum);

  return 0;

  }

  Программа получилась довольно простая и не требует дополнительных комментариев. 

  Задача 2. Для заданного вещественного значения x вычислить элементы квадратной матрицы A, имеющей следующий вид:

  

  Перед составлением алгоритма отметим  характерную особенность матрицы  A: степень основания x каждого элемента матрицы равна сумме номера строки i и столбца j, на пересечении которых размещен данный элемент (при условии отсчета индексов от нуля). Например, для элемента, расположенного на пересечении третьей строки и второго столбца, имеем a(3,2) = x3+2. В общем виде можно записать представление элемента матрицы А как a(i,j) = xi+j.

  Самый простой способ решения поставленной задачи - это непосредственно воспользоваться последней формулой. Однако в некоторых версиях языка Си отсутствует функция возведения в степень. Для возведения числа в произвольную степень можно воспользоваться известной формулой ab=eb×ln(a), и тогда программа решения задачи может выглядеть следующим образом: 

  #include <stdio.h>

  #include <stdlib.h>

  #include <math.h> 

  int main()

  {

  int i, j;

  double x, a[3][3];

      printf("введите x > ");

      scanf("%lf",&x);

     for(i=0; i< 3; i++)

         {

            for(j=0; j< 3; j++)

                  {

                      a[i][j]= exp( (i+j)*log(x) );

                      printf("%10.3lf", a[i][j]);

                  }

            printf("\n");

             }

     return 0;

  } 

  Представленный вариант программы не является оптимальным, так как возведение в степень, связанное с вычислением элементарных функций exp(x) и ln(x), займет больше времени и будет менее точным (мало того, значения переменной x не могут быть отрицательными) по сравнению с многократным умножением. Поэтому, если вы дорожите скоростью и точностью вычислений, то вычисления необходимо проводить по рекуррентной формуле. Для этого в новой программе понадобятся еще две новые переменные bi и bj, необходимые для "накопления произведения" во внешнем и внутреннем циклах соответственно. 

  #include <stdio.h>

  #include <stdlib.h> 

  int main()

  {

  int i, j;

  double x, bi, bj, a[3][3];

      printf("введите x > ");

      scanf("%lf",&x);

     bi=1;

     for(i=0; i< 3; i++)

         {

            bj=bi;

            for(j=0; j< 3; j++)

                  {

                      a[i][j]= bj;

                      printf("%10.3lf", a[i][j]);

                      bj=bj*x;

                  }

               bi=bi*x;

              printf("\n");

             }

     return 0;

  } 

  Накопление  произведения в приведённой программе происходит по формуле типа b=b * x, где x - вводимый с клавиатуры множитель, b - накапливающий коэффициент.

  Последняя программа с многократным умножением все равно не является оптимальной  по скорости выполнения, так как  матрица является симметрической (симметричной относительно главной диагонали) и достаточно вычислить элементы выше (или ниже) главной диагонали. Попробуйте усовершенствовать программу так, чтобы в матрице A считались лишь элементы, расположенные на главной диагонали и выше. Элементы ниже главной диагонали заполнить значениями «симметричных» элементов.

5.4. Задания на двумерный массив

    1. Найти  наибольший элемент aik главной диагонали квадратной матрицы A и вывести на экран всю строку, в которой он находится (для элементов главной диагонали i = k).

    2. Вычислить  сумму элементов bik квадратной матрицы B, расположенных над главной диагональю (для элементов главной диагонали i = k).

    3. Из  квадратной матрицы X построить матрицу Y, заменив строки столбцами (транспонирование матрицы). Исходную и полученную матрицу вывести на экран.

    4. Определить  количество положительных и отрицательных  элементов матрицы A.

    5. Определить  количество положительных элементов  xk каждого столбца матрицы X и переписать их в одномерный массив (вектор) M.

    6. Найти  наибольший элемент aik матрицы A, элементы которой вычисляются по формуле aik=xi*yk. Векторы X = {x1, x2,...,  xi} и  
    Y= {y1, y2, ..., yk} считаются заданными.

    7. Найти  минимальные элементы xik в каждой строке квадратной матрицы X и поместить их на главной диагонали, а диагональные элементы записать на место минимальных (для элементов главной диагонали i = k).

    8. Найти  наименьший элемент xik матрицы X. Затем в строке и в столбце, где он находился, все элементы заменить нулями. Исходную и полученную матрицу вывести на экран.

    9. Вычислить  сумму положительных элементов  aik каждой строки матрицы A. Найти наибольшую из этих сумм, а также номер этой строки.

    10. Выделить  положительные и отрицательные  элементы xik главной диагонали квадратной матрицы X. Записать их в два одномерных массива (вектора) P = {p1, p2, ...} и N = {n1, n2, ...} и вывести их на экран.

    11. Найти  среднее арифметическое положительных  элементов xik каждого столбца матрицы X при условии, что в каждом столбце есть хотя бы один элемент больше нуля.

Информация о работе Лекции по "Высшая математика"