Вычисление формул и деление на "0" - Pascal

Узнай цену своей работы

Формулировка задачи:

Для аргумента , изменяющегося от –0.6 с шагом 0.05 вычислить 20 значений функций: f1(x)=x/2+x*x/4+1/2*(1-x*x)*ln(1-x) f2(x)=sum(K от 1 до бесконечности)((x^(k+2)/k(k+2))) Cмысл проблемы в том, что задача решается только для 7ми значений, а дальше деление на ноль при решении функции f2(x), гляньте, где я накосячил. спс.
program opredelenie_znacheniy_funkcii;
Uses Crt;  {podgrujaem modul}
Const      {opredeljaem konstanti}
eps1=0.01; {tochnost 1/100}
eps2=0.001;{tochnost 1/1000}
eps3=0.0001;{tochnost 1/10000}
a=-0.6;    {nachalnoe znachenie x}
b=0.05;     {tochnost}
n=7;      {kollichestvo znachenij funkcii}
Var
k1,k2,k3,i:integer; {vspomogatelnie peremennie}
f1,f2_1,f2_2,f2_3,step,slag,x:extended;
begin
Clrscr;    {ochischaem ekran}
{------------------------risuem shapku tablici---------------------}

x:=a;       {nachalnoe znacenie x}
for i:=1 to n do {vichisljaem 20 znachenij}
    begin
    {--------------vichislenie f(x1)-----------------------}
     f1:=x/2+x*x/4+0.5*(1-x*x)*ln(1-x); {f(x1)-vicislenie}
     step:=x*x; {nachalnoe znachenie stepeni}
     f2_1:=0; {nachalnoe znachenie funkcii f2(x)-0.01}
     k1:=0;   {nachalnoe znachenie k v f2(x)}
     {-------------vichislenie f(x)1----------------------}
     repeat
           inc(k1);   {uvelichivaem k}
           step:=step*x;           {uvelichivaem stepen}
           slag:=step/(k1*(k1+2)); {opredelaem ocherednoe slagaemoe}
           f2_1:=f2_1+slag;        {nahodim znachenie funkcii}
           {writeln('f2_1=',f2_1,' k1=',k1);}
     until abs(f2_1)>=eps1; {vihodim iz cikla kogda chislo menshe libo ravno tochnosti eps=0.001}
     {-------------vichislenie f(x)2----------------------}
     f2_2:=f2_1;                   {znachenie f(x)1=f(x)2}
     k2:=k1;                        {prodoljaem schitat}
     repeat
           inc(k2);
           step:=step*x;           {uvelichivaem stepen}
           slag:=step/(k2*(k2+2)); {opredelaem ocherednoe slagaemoe}
           f2_2:=f2_2+slag;        {nahodim znachenie funkcii}
           {writeln('f2_2=',f2_2,' k2=',k2);}
     until abs(f2_2)>=eps2; {vihod kogda f(x)2<=eps(0.001)}
     {-------------vichislenie f(x)3----------------------}
     f2_3:=f2_2;                   {znachenie f(x)2=f(x)1}
     k3:=k2;                       {prodoljaem schitat}
     repeat
           inc(k3);
           step:=step*x;           {uvelichivaem stepen}
           slag:=step/(k3*(k3+2));  {opredelaem ocherednoe slagaemoe}
           f2_3:=f2_3+slag;        {nahodim znachenie funkcii}
           {writeln('f2_3=',f2_3,' k3=',k3);}
     until abs(f2_3)>=eps3; {vihod kogda f(x)3<=eps(0.0001)}
     {--------------vivod rezultata----------------------}
    writeln('|',x:5:2,'|',f1:12:9,'|',f2_1:5:2,'|',k1:2,'|',f2_2:6:3,'|',k2:2,'|',f2_3:7:4,'|',k3:2,'|');
    x:=x+b; {uvelichivaem na shag}
    end;
 
ReadKey
end.

Решение задачи: «Вычисление формул и деление на "0"»

textual
Листинг программы
const xn=-0.6;
      dx=0.05;
      e=0.0001;
      n=20;
function f1(x,e:real):real;
var k:integer;
    t,s:real;
begin
k:=1;
t:=x*x*x;
s:=t/3;
while abs(t/(k*(k+2)))>e do
 begin
  k:=k+1;
  t:=t*x;
  s:=s+t/(k*(k+2));
 end;
f1:=s;
end;
function f2(x:real):real;
begin
f2:=x/2+x*x/4+(1-x)*ln(1-x)/2;
end;
var x:real;
    k:integer;
begin
x:=xn;
for k:=1 to n do
 begin
  writeln('x=',x:5:2,' f1=',f1(x,e):7:4,' f2=',f2(x):7:4);
  x:=x+dx;
 end;
end.

Объяснение кода листинга программы

  1. Объявление и инициализация констант:
    • xn равно -0.6
    • dx равно 0.05
    • e равно 0.0001
    • n равно 20
  2. Описание функции f1:
    • Принимает параметры x и e и возвращает значение типа real
    • Объявление переменных k, t и s
    • Инициализация переменной k значением 1
    • Вычисление значения переменных t и s
    • Цикл while, выполняющийся до тех пор, пока абсолютное значение t/(k*(k+2)) больше e
    • В цикле обновление переменных k, t и s
    • Возврат значения s
  3. Описание функции f2:
    • Принимает параметр x и возвращает значение типа real
    • Возвращает значение x/2 + x*x/4 + (1-x)*ln(1-x)/2
  4. Объявление основной переменной x и переменной k
    • Назначение начального значения переменной x равным xn
    • Цикл for, выполняющийся от 1 до n
    • В цикле вывод на экран значений: 'x=', значение переменной x с точностью 2 знака после запятой, ' f1=', значение функции f1 с параметрами x и e с точностью 4 знака после запятой, ' f2=', значение функции f2 с параметром x с точностью 4 знака после запятой
    • Обновление значения переменной x путем прибавления значения dx

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы