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