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

Ваш аккаунт

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

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

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

C# - Вычисление ряда.

88K
17 января 2015 года
Анастасия Наумова
2 / / 17.01.2015
Всем привет, только начала изучать C#, в лабе попалось задание - Составить и отладить программу для приближённого вычисления заданной функции у(х) путём суммирования чле нов заданного её ряда s(x) см. таблицу 4.2. Суммирование членов ряда проводить до члена ряда, значение которого по абсолютной величине не будет превышать 10^(-6). Вычислить сумму ряда s(x) и непосредственно функцию у(х) при указанных в таблице 4.2 контрольных значениях аргументаx. Сравнить и проанализировать полученные значения.



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


Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Application
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            double x, y, s, a, d, чл, зн;
            int w,l,i,k,m;
            m1: Console.WriteLine(" Введите значение X");
            x = double.Parse((Console.ReadLine()));
            Console.WriteLine('t' + " Промежуточные результаты" + 'n');
                k = 0; // Номер итерации.
                s = 0;
                w = 1;
                d = 1;
                l = 2;
                m = 2;
                i = 1;
                a = 1; // Первый член ряда.
            while (Math.Abs(a)> 0.000001)
                {
                    s += a; // Сумма ряда на текущей итерации,
                    чл = d; // Вычисление числителя ряда
                    зн = m; // Знаменатель ряда.
                    a = чл/зн;// Член ряда на текущей итерации.
                    l += 2;
                m = l * (-m);
                    d = d * w * Math.Pow(x,i);
                    w += 2;
                    i += 1;
                    k++; // Счётчик итераций.
                    Console.WriteLine('t' + " Итерация №" + k + 'n' + "чл=" + чл + 't' + "зн=" + зн+ 't' + "a=" + a);
                }
                            y = Math.Sqrt(x+1);
                            Console.WriteLine('t' + " РЕЗУЛЬТАТЫ:" +'n' + " Вычисленная сумма ряда S =" + s + 'n' +
                                " Количество членов ряда - " + k + 'n' + " Функция =" + y + 'n');
                            Console.WriteLine('n' + " Для повторного ввода" + "набрать любую клавишу." +'n' + "Для завершения программы нажмите Enter.");
                                string rep = Console.ReadLine();
                                if (rep != "") goto m1;
        }
    }
}
446
18 января 2015 года
Meander
487 / / 04.09.2011
Посмотрите мой вариант, вроде работает.
Вам следует особое внимание уделить процедуре вычисления членов ряда.
Код:
/*
 * Сделано в SharpDevelop.
 * Пользователь: JARVIS
 * Дата: 17.01.2015
 * Время: 20:45
 *
 * Для изменения этого шаблона используйте Сервис | Настройка | Кодирование | Правка стандартных заголовков.
 */

using System;

namespace Series
{
    class Program
    {
        public static void Main(string[] args)
        {
            //Console.WriteLine("Hello World!");
            // Программа вычисляет сумму ряда
            // и сравнивает полученные значения
            // со значениями функции, которая
            // аппроксимируется рядом
           
            // Используем информативные идентификаторы
            int       N_point   = 3;//число точек в которых следует вычислить функцию
            double    tolerance = 1.0e-6;
            // Применим массив, хотя, конечно можно обойтись без него
            double [] argument  = { -0.84, 1.0, 2.0 };
            //Цикл по расчетным точкам
            for(int i=0;i<N_point;i++){
              // Заранее вычислим "точное" значение данной функции
              double exactly = Math.Sqrt(argument[i] + 1.0);
              // Вычисление частичной суммы ряда
              int    terms = 1;//число членов разложения
              double S     = 1.0;//частичная сумма ряда
              double delta = S - exactly;
              //
              double s = 1.0,
                     p = 1.0,//множители числителя
                     q = 2.0;//множители знаменателя
              //
              while (Math.Abs(delta) > tolerance){
                //Будем по очереди умножать и делить на
          //множители числителя и знаменателя
                s *= p;
                s /= q;
                if(terms > 1)
                  p += 2.0;
                q += 2.0;
                s *= argument[i];// Домножение элемента ряда на аргумент
                if((terms % 2) == 0) S -= s;
                else                 S += s;
                delta = S - exactly;
                terms++;
              }
              // Печать результатов
              Console.WriteLine("X["   + i + "]  = " + argument[i] + ";");
              Console.WriteLine("F(X[" + i + "]) = " + exactly     + ";");
              Console.WriteLine("S(X[" + i + "]) = " + S           + ";");
              Console.WriteLine("S(x) - F(x) = "     + delta       + ";");
              Console.WriteLine("N terms     = "     + terms       + ";");
              //Как выяснилось данный ряд расходится при x > 1
              if(Double.NaN.Equals(S))
                Console.WriteLine("At the value of the argument diverges!");
              Console.WriteLine("--------------------------------------");
            }
            //
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}
88K
18 января 2015 года
Анастасия Наумова
2 / / 17.01.2015
Спасибо большое!
Очень помогли и исправила свою программу :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог