Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Не могу решить

Ирина Червонец Ученик (118), закрыт 1 год назад
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от Xнач до Xкон с шагом dx с точностью ε. Требования к программе: - Таблицу снабдить заголовком и шапкой. - Каждая строка таблицы должна содержать: o значение аргумента, значение функции и количество просуммированных членов ряда. - Предусмотрите вывод сообщения о невозможности вычислить ряд с заданной точностью. Нужно написать программу на языке C#
Лучший ответ
Вячеслав Мыслитель (9266) 1 год назад
Тут вся хитрость в том, что для большИх положительных x сумму этого ряда просто так на компьютере при помощи чисел, представленных с ограниченной точностью, не вычислить, а надо действовать более тонко:
 using System;  
namespace MySpace
{
public static class Program
{
public static double f(double x)
{
if (x > 0) return 1.0 / f(-x);
double y = -x, sum = 1.0, product = sum, n = 0.0;
while (product / sum > 1e-18)
{
n += 1.0;
product *= y / n;
sum += product;
}
return sum;
}
public static void Main()
{
double x, y;
for (;;)
{
Console.Write("x » ");
x = double.Parse(Console.ReadLine());
y = f(x);
Console.WriteLine(y + ", err=" + (y/Math.Exp(-x)-1.0));
}
}
}
}
Вот так грамотно. В функции f(x)=e⁻ˣ мы просто сделали рекурсивный вызов чтобы программно обойти наиболее неприятный случай.
ВячеславМыслитель (9266) 1 год назад
Проверив работоспособность и корректность разработанной нами функции пишем код по заданию:
 using System;   
namespace MySpace
{
public static class Program
{
public static double N;
public static double f(double x, double ε)
{
if (x > 0) return 1.0 / f(-x, ε);
double y = -x, sum = 1.0, product = sum;
N = 0.0;
while (product / sum > ε)
{
N += 1.0;
product *= y / N;
sum += product;
}
N += 1.0;
return sum;
}
public static void Main()
{
int i, j, n;
double dx, x, Xнач, Xкон, y, ε;
Console.Write("Xнач Хкон dx ε » ");
var s = Console.ReadLine().Split(" ");
Xнач = double.Parse(s[0]);
Xкон = double.Parse(s[1]);
ВячеславМыслитель (9266) 1 год назад
       dx = double.Parse(s[2]); 
ε = double.Parse(s[3]);
n = (int)((Xкон-Xнач)/dx);
for (i = 0; i < 50; ++i) Console.Write("—");
Console.WriteLine();
Console.WriteLine(" Таблица функции у = e⁻ˣ");
for (i = 0; i < 50; ++i) Console.Write("—");
Console.WriteLine();
for (i = 0; i <= n; ++i)
{
x = Xнач + i * dx;
y = f(x, ε);
Console.WriteLine("{0,12:f8}{1,26:e16}{2,12:f0}", x, y, N);
}
for (i = 0; i < 50; ++i) Console.Write("—");
Console.WriteLine();
}
}
}
Остальные ответы
Давид Мейстер Мастер (2088) 1 год назад
А можно текстом? Я же не на листочке решать буду

Если правильно понял, то можно так:
 using System; 

class TaylorSeries
{
static double CalculateTaylorSeries(double x, double epsilon, out int n)
{
double result = 1.0;
double term = 1.0;
n = 1;
double factorial = 1;

while (Math.Abs(term) > epsilon)
{
factorial *= n;
term = Math.Pow(x, n) / factorial;
result += term;
n++;
}

return result;
}

static void Main()
{
double xStart = -2.0;
double xEnd = 2.0;
double dx = 0.1;
double epsilon = 0.0001;

Console.WriteLine("X\t\tFunction Value\tTerms Count");
for (double x = xStart; x <= xEnd; x += dx)
{
int termsCount;
double functionValue = CalculateTaylorSeries(x, epsilon, out termsCount);
Console.WriteLine($"{x}\t\t{functionValue}\t{termsCount}");
}
}
}
ВячеславМыслитель (9266) 1 год назад
Ошибок черезчур много. Во-первых, табулировать надо функцию e⁻ˣ, а вовсе не eˣ. Во-вторых, если уж табулируешь на [-2;2] с шагом 0,1, то аргументы должны пробегать значения от -2 до 2, а у тебя вон что:В-третьих, вывод грязный - можно ведь и поровнее выводить. В-четвёртых, нахрен тебе здесь Pow? Ты про реккуренцию вообще слышал? В-пятых, попробуй замени пределы табуляции на -50 и 50, а шаг, скажем, на 5 и сражу убедишься, что e⁻⁵⁰ у тебя окажется черезчур большим положительным числом, чего не должно быть в принципе!
И многие другие твои ответы такие же в точности непродуманные, если не сказать дебильные.
Давид Мейстер Мастер (2088) Вячеслав, Я бы с таким кпд молчал про дебильные ответы
Похожие вопросы