Изучение основных способов представления математических проблем в символьном виде

Страницы работы

Содержание работы

1.  Цель работы:

Изучение основных способов представления математических проблем в символьном виде, пригодном для формальной обработки на компьютере.

2.  Задание

1.  На примере программы  символьного дифференцирования, прилагаемого к данной лабораторной работе, рассмотреть структуру данных для представления математических выражений.

2.  Развить данную структуру для представления вещественных чисел, комплексных чисел.

3.  Познакомиться с принципами лексического и синтаксического анализа входных строковых выражений, представляющих математические тексты.

4.  Познакомиться с принципами трансляции из внутреннего представления математических выражений во внешнее – строковое.

5.  Рассмотреть Пролог – программу  для символьного дифференцирования и упрощения алгебраических выражений с точки зрения декларативной семантики (как систему аксиом)

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

3.  Выполнение работы

Расширение используемой структуры данных для вещественных и комплексных чисел.

·  Для поддержки и использования вещественных чисел в программе необходимо выполнить следующие модификации правил:

а) Правило elmexp(["-",TALSTR|IL],IL,int(INT)):-

                             str_int(TALSTR,INTp),

INT = -INTp.  необходимо заменить на

elmexp(["-",TALSTR|IL],IL,int(INT)):-

 str_real(TALSTR,INTp),

                              INT = -INTp.

б) Правило elmexp([TALSTR|IL],IL,int(INT)):-str_int(TALSTR,INT),!.

заменить на elmexp([TALSTR|IL],IL,int(INT)):- str_real(TALSTR,INT),!.

в) Правило преобразования выражения в строку вида:

strexp(int(INT),INTSTR) :-  str_int(INTSTR,INT).

заменить на strexp(int(INT),INTSTR) :- str_real(INTSTR,INT).

г) В структуре данных, представляющей выражение EXP, заменить элемент

INT(INTEGER) на INT(REAL).

Для удобства чтения программы можно было бы заменить имя объекта числа в математическом выражении EXP с INT на FLOAT.

·  Чтобы программа корректно обрабатывала комплексные числа, необходимо добавить ряд правил, учитывающих свойства мнимой единицы i

(i2 = -1, i3 = -i, …. ).  Необходимо добавить в reducer правила:

multr(var(i),var(i),int(-1)).

  multr(var(i),X,R):-multr(X,var(i),R),!.

  multr(mult(X,var(i)),var(i),R):-!, multr(int(-1),X,R).

  multr(var(i),mult(X,var(i)),R):-!, multr(int(-1),X,R).

Во всех остальных случаях i обрабатывается как константа.

·  Для обработки вещественных чисел необходимо добавить дополнительные правила в reducer:

а) Ассоциативность умножения

multr(int(X),mult(int(Y),Z),mult(int(R),Z)):-!,R=X*Y.

  multr(int(X),mult(Z,int(Y)),mult(int(R),Z)):-!,R=X*Y.

  multr(mult(int(Y),Z),int(X),mult(int(R),Z)):-!,R=X*Y.

  multr(mult(Z,int(Y)),int(X),mult(int(R),Z)):-!,R=X*Y.

б) Упрощение деления

multr(X,X,potens(X,int(2))):-!.

  multr(X,Y,mult(X,Y)).

в) Нецелочисленное деление

  divr(mult(int(X),V),int(Y),mult(int(Z),V)):-!,X/Y=Z.

  divr(mult(V,int(X)),int(Y),mult(int(Z),V)):-!,X/Y=Z.

Разработка правил интегрирования.

Предикат интегрирования будет выглядеть следующим образом: i(EXP,EXP,EXP), где первый аргумент – исходное выражение, второй аргумент – выражение под дифференциалом (первоначально – var(“x”) ), а последний – результат интегрирования.

В программу включены правила, реализующие основные свойства интеграла, а также правила интегрирования некоторых функций (взяты из справочника интегралов):

 , , , ,

, , , тригонометрические функции.

Основные правила интегрирования:

i(int(C),X,mult(int(C),X)).

  i(X,X,div(potens(X,int(2)),int(2))).

  i(var(Y),var(X),mult(var(Y),var(X))):-Y<>X.

  i(var(Y),V,mult(var(Y),V)):-Y<>"x".

  i(plus(U,V),X,plus(U1,V1)):-i(U,X,U1),i(V,X,V1).

  i(minus(U,V),X,minus(U1,V1)):-i(U,X,U1),i(V,X,V1).

  i(mult(int(C),V),X,mult(int(C),V1)):-i(V,X,V1).

  i(mult(var(Y),V),var(X),mult(var(Y),V1)):- X<>Y,i(V,var(X),V1).

  i(div(V,int(C)),X,div(V1,int(C))):-  i(V,X,V1).

Правила замены переменной:

i(mult(U,V),X,Z): -i(U,X,U1), i(V,U1,Z).

i(mult(U,V),X,Z):-i(V,X,V1),i(U,V1,Z).

Правила интегрирования по частям:

i(mult(mult(U,int(I)),V),X,mult(int(I),UV)):-

      i(mult(U,V),X,UV).

  i(mult(mult(int(I),U),V),X,mult(int(I),UV)):-

      i(mult(U,V),X,UV).

  i(mult(V,mult(U,int(I))),X,mult(int(I),UV)):-

      i(mult(U,V),X,UV).

  i(mult(V,mult(int(I),U)),X,mult(int(I),UV)):-

      i(mult(U,V),X,UV).

  i(mult(var(X),U),var(X),minus(mult(var(X),U1),U2)):-      

      i(U,var(X),U1),

      i(U1,var(X),U2).

  i(mult(potens(var(X),int(I)),U),var(X),minus(mult(potens(var(X),int(I)),U1),U2)):-

      I1=I-1,

      T=mult(potens(var(X),int(I1)),int(I)),

      reduce(T,U3),

      i(U,var(X),U1),

      i(mult(U3,U1),var(X),U2).

4.  Тестирование программы

Тест

Результат

0

0

1

x

x +2

x^2/2+2*x

(x+2)^4

(x+2)^5/5

2.2*sin(2*x)

-1.1*cos(2*x)

tan(x)

-1*ln(cos(x))

1/x

ln(x)

i*i*2^x

-1*2^x/ln(2)

cos(x)*sin(x)

sin(x)^2/2

x*sin(x)

sin(x)-x*cos(x)

x^2/4+1/x

0.8333333*x^3+ln(x)

2.5*sin(x)^2*cos(x)

0.8333333*sin(x)^3

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

Информация о работе