C# - Вычисление ряда.
По примеру составила и вроде высчитывает правильно числитель и знаменатель - но потом пишет везде бесконечно и очень много итераций проходит.
Помогите, пожалуйста.
Код:
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;
}
}
}
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;
}
}
}
Вам следует особое внимание уделить процедуре вычисления членов ряда.
Код:
/*
* Сделано в 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);
}
}
}
* Сделано в 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);
}
}
}
Очень помогли и исправила свою программу :)