• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Тоже проблема с Рядом Тейлора.

Хелен

Sparkling
Регистрация
28 Сен 2010
Сообщения
98
Реакции
2
Баллы
0
Тоже проблема с Рядом Тейлора.

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью рада Тейлора, на интервале от хнач до хкон с шагом dx с точностью Эпсилон. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента, значение функции и колличество просуммированных членов ряда.
Просмотрев предыдущую программу. многое не поняла. Если у кого-то есть возможность написать не просто прогу, а добавить комментарии. Заранее спасибо.
 

Вложения

  • Задание 3.2.webp
    Задание 3.2.webp
    15 KB · Просмотры: 2,962
Просмотрев предыдущую программу. многое не поняла.
Лена, а вот давайте начнем именно с этого. Чего Вы не поняли? Задавайте вопросы, попробуем разобраться.
В Вашем случае программа выглядит вот так:
Код:
CONST
 Eps=0.0001;
VAR
 Xbeg,Xfin,DX,SUM,X:REAL;
 N:WORD;
 Nx,i:INTEGER;

FUNCTION ArcCos(Xa:Extended):Extended;
 begin
  if ROUND(Xa*10000000)=10000000 then ArcCos:=0 else
  if ROUND(Xa*10000000)=-10000000 then ArcCos:=Pi else
  ArcCos:=(Pi/2)-ArcTan(Xa/SQRT(1-Xa*Xa));
 end;


PROCEDURE SUMS(Xs:REAL; Var S:REAL; Var Ns:WORD);
 VAR
   a:REAL;
 Begin
  a:=Xs;
  S:=Xs;
  Ns:=0;
  Repeat
   Inc(Ns);
   a:=a*SQR(Xs)*(2*Ns-1)*(2*Ns-1)/(2*Ns)/(2*Ns+1);
   S:=S+a;
  Until Abs(a)<Eps;
  S:=Pi/2-S;
 End;

BEGIN
 Write('Xbeg= ');
 ReadLn(Xbeg);
 Write('Xfin= ');
 ReadLn(Xfin);
 Write('DX= ');
 ReadLn(DX);
 WriteLn;
 WriteLn('         Results of calculation:');
 WriteLn('    X          SUM         N    ArcCos(X)');
 WriteLn;
 Nx:=ROUND((Xfin-Xbeg)/DX);
 X:=Xbeg;
 For i:=0 to Nx do
  begin
   X:=Xbeg+DX*i;
   SUMS(X,SUM,N);
   WriteLn(X:8:5,'     ',SUM:7:5,'     ',N:3,'     ',ArcCos(X):7:5);
  end;
 ReadLn;
END.
 
Спасибо. Сравню с тем, что написала и отвечу =)
 
Вот мой код. Мне кажется, что несмотря на длину, он более удачен.

PHP:
program var20; {$N+}
const pi2 = 3.141592653589793238462643/2;
var
   x,x1,xk,dx,e,i:integer;
   itog:extended;
   s: string;
   shir: integer;

{procedura razmnozhaet simvol na ekrane}
procedure mnogo(si:char;k:integer);
var tmpi: integer;
begin
for tmpi := 1 to k do write(si);
end;

{funkcia vozvodit chislo v stepen}
function step(ch,st: integer): extended;
var tmpi: integer;
    tmps: extended;
begin
     tmps := 1;
for tmpi := 1 to st do tmps := tmps * ch;
     step := tmps;
end;

{schitaem znachenie odnoy drobi s nomerom NOM}
function drob(nom: integer): extended;
var
   n, tmpi: integer;
re: extended; {re = resultat}
begin
  n := 2*nom+1;
  re := 1;
  for tmpi := 1 to n-1 do
if (tmpi mod 2) =1 then re := re * tmpi else re := re / tmpi;
  re := re / n;
  drob := re;
end;

{schitaem summu drobey}
function sumdrob: extended;
var
   i: integer;
   sum: extended;
begin
  sum := x;
  for i := 1 to x do
sum := sum + drob(i)*step(x,2*i +1);
  sumdrob := sum;
end;

{ ************* main program *********** }
begin
{x1:=1;xk:=6;dx:=1;e:=5;} {eto dlya proverki}
     writeln;writeln;writeln;
write('Input x1: ');readln(x1);
write('Input xk: ');readln(xk);
write('Input dx: ');readln(dx);
write('Input e: ');readln(e);
     writeln;writeln;writeln;

     {Kakaya u nas shirina}
       shir := 1;
     for x := x1 to xk do
     begin
str((pi2-sumdrob):2:e,s); {vychislim i preobrazuem v string}
if (length(s) +2) > shir then shir := length(s) +2;
     end;
if shir < 10 then shir := 10; {minimum 10}

{Risuem zagolovok tablicy}
writeln(' Moya super-puper formula');
mnogo('=',shir+16);writeln;
     {zagolovki}
write('| X | ');
mnogo(' ',(shir-8) div 2); {probely DO}
write('Zna4enie');
mnogo(' ',shir-8-((shir-8) div 2)); {probely POSLE}
writeln(' | Kol |');
mnogo('=',shir+16);writeln;

     {Nachinaem}
     x := x1; {ot nachala}
     while x <= xk do
     begin
       itog := pi2-sumdrob;

writeln('| ', x:3, ' | ', (itog):shir:e, ' | ', (x+1):3, ' |');
x := x + dx; {i kazdiy raz pribavlaem}
     end;

mnogo('=',shir+16);writeln;
     readln;
end.
 
Нет, Лена - так дело не пойдет!
Весь диапазон допустимых значений аргумента функции (х) - от -1 до +1 , а Вы задаёте ему тип Integer! Это прежде всего.
Из мелочей - нет нужды вводить численное значение константы "пи" - в Паскале есть стандартная функция Pi, отдающая это значение с высокой точностью.
В других аспектах программы не разбирался.
А что касается "удачен"-"неудачен" - так это дело вкуса. Мне мой больше нравится. Хотя там украшательства минимизированы (псевдографика и пр.). Но, повторяю, у каждого программиста свой стиль.
 
Есть нужда вводить Пи в константу, дабы далее укоротить программу, если заметите, что в константе добавлены /2.
И, к сожалению, для преподавателя важна графика, т.к. учимся мы подготавливать разнообразные программы для лёгкого обращения любым пользователем...
 
Есть нужда вводить Пи в константу, дабы далее укоротить программу, если заметите, что в константе добавлены /2.
И, к сожалению, для преподавателя важна графика, т.к. учимся мы подготавливать разнообразные программы для лёгкого обращения любым пользователем...
Лена, Вы совсем не о том - повторяю, все эти константы да псевдографика - чушь на постном масле (хотя, если честно, абсолютно не вижу, что изменится, если строку
itog := pi2-sumdrob;
заменить строкой
itog := pi/2-sumdrob;
и
при этом никакую константу не вводить. Но это так, к слову - хотите со своей константой - Ваше дело). Куда важнее другое.

1. Еще раз обращаю внимание - Вы считаете значения функции arccos(x). Эта функция определена в интервале значений х
-1 ≤ х ≤ +1
а потому использование целочисленных (integer) форматов переменных x, x1, xk, dx АБСОЛЮТНО НЕДОПУСТИМО.
2. Вы совершенно неправильно трактуете смысл величины эпсилон (ε). Эта величина никакого отношения к форматам вывода чисел не имеет, а определяет, в конечном итоге, количество членов ряда, которое необходимо взять, чтобы результат был вычислен с заданной точностью (поэтому в моей программе и предусмотрен, для сравнения, вывод в последней колонке ТОЧНОГО значения функции arccos). По сути ε - это ни что иное, как значение остаточного члена ряда Тейлора. Почитайте в учебнике по матанализу, что есть остаточный член в форме Коши или в форме Пеано. В первом приближении (как сделано в моей программе) ряд можно прервать, когда следующий член разложения становится по абсолютной величине меньшим, чем наперед заданное ε, например ε=0.0001.

И вообще, посмотрев внимательнее Вашу программу, пришел я к выводу, что Вы не очень четко разобрались в том, что такое ряд Тейлора, в частности Вы явно путаете переменную x с индексом суммирования n.
 
Я не путаю. программа проверена. множество значений подставлено и просчитано. программа выдаёт верные ответы, что и требовалось.
И... согласна - у каждого свой стиль.
 
ещё можно задавать вопросы по вашей программе??

Откуда вы взяли эту формулу??

Nx:=ROUND((Xfin-Xbeg)/DX);
 
ещё можно задавать вопросы по вашей программе??

Откуда вы взяли эту формулу??

Nx:=ROUND((Xfin-Xbeg)/DX);
Дык... из головы, вестимо. А что в ней странного или непонятного? Если интервал от a до b разбит на N равных промежутков, то величина каждого промежутка D есть (b-a)/N; в свою очередь, если мы знаем D и хотим определить N, то имеем N=(b-a)/D. Округление (Round) там применено потому, что N должно быть целым.
 
Назад
Сверху