Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 19.06.2012
Сообщений: 5
1

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

14.01.2015, 22:26. Показов 1596. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

я только изучаю Хаскелл, и не особо в нем разбираюсь, но мне надо сделать на нем проект.
Необходимо написать программу, которая символически определяет производную функции переменной x. Функция задана выражением, которое состоит из арифметических операций; функций sin, cos, tg, exp, ln; скобок, констант и переменной x, например: sin(1/x)*exp(x^3-2). Использовать можно только библиотеки Prelude, System.IO и System.Environment.

На форуме я нашла похожие темы, но все-таки до конца того, что мне надо, там не было.
Внизу код, который пока у меня есть, но он работает, если я напишу данные в определенном формате. Я не знаю, что надо использовать, чтобы программа принимала функции и выводила результаты в обычном формате. Так что я буду благодарна, если кто-нибудь мне поможет

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
data Expression = 
        Const Integer | X | Neg Expression |
        Expression :/: Expression |  Expression :*: Expression|
        Expression :+: Expression | Expression :-: Expression |
        Expression :^: Expression| 
        Sin Expression | Cos Expression | Tg Expression | Cos2 Expression|
        Exp Expression | Ln Expression
        deriving Show
 
 
diff X = Const 1
diff (Const _) = Const 0
 
diff (Sin X) = Cos X
diff (Sin x) = Cos x :*: diff(x)
 
diff (Cos X) = Neg (Sin X)
diff (Cos x) = Neg(Sin x) :*: diff(x)
 
diff (Tg X) =  (Const 1) :/: (Cos2 X)
diff (Tg x) =  ((Const 1) :/: (Cos2 x)) :*: diff(x)
 
diff (Exp X) = Exp X
diff (Exp x) = Exp x :*: diff(x)
 
diff (Ln X) = (Const 1) :/: X
diff (Ln x) = ((Const 1) :/: x):*:diff(x)
 
 
diff ( X :^: Const n) = (Const n):*:(X :^: (Const(n-1))) 
diff ( y :^: Const n) = (Const n) :*: y :*:diff (y)
 
diff (Const n :*: X) = Const n
diff (Const n :*:  X :^: Const n2) = Const (n*n2) :*:( X :^: Const (n2-1))
diff (x :*: y) = ((diff x):*:y) :+: ( x :*:(diff y))
 
diff (x :/: y) = ((diff(x):*:y):-:( x :*:(diff(y)))):/:( y:^: (Const 2))
 
diff ( x :+: y) = (diff x):+:(diff y)
 
diff ( x :-: y) = (diff x):-:(diff y)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2015, 22:26
Ответы с готовыми решениями:

Алгебраическое выражение
Доброго времени суток , помогите пожалуйста преобразовать алгебраическое выражение , что бы его...

Алгебраическое выражение
Алгебраическое выражение (без скобок) типа А*В+С*Е, введенное в режиме диалога, посимвольно...

Преобразовать арифметическое выражение из постфиксной формы в инфиксную
У меня задача: преобразовать арифметическое выражение из переменных, знаков арифметическич операций...

Упростить алгебраическое выражение
Воспользовавшись законами алгебры множеств максимально упростите заданное в таблице 2...

1
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
15.01.2015, 13:36 2
Ну, дифференцирование, я предполагаю, вы сделали. Непонятно что за функция Cos2, ну да ладно.
Я приделал упрощение выражений (не полное) функцией reduce и вывод в более приличном виде выражения вручную определив экземпляр Show для типа Expression. Надо бы лишние скобки убрать, но это приоритет операций учитывать - не так просто.
И парсинг из выражения вида sin(1/x)*exp(x^3-2) с помощью только Prelude - извините. Может это кто то другой Вам поможет.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import System.IO (hFlush, stdout)
 
data Expression = 
        Const Integer | X | Neg Expression |
        Expression :/: Expression |  Expression :*: Expression|
        Expression :+: Expression | Expression :-: Expression |
        Expression :^: Expression| 
        Sin Expression | Cos Expression | Tg Expression | Cos2 Expression|
        Exp Expression | Ln Expression
        deriving Read
        --deriving Show
 
instance Show Expression where
    show (Const n) = show n
    show (X) = "x"
    show (Neg e) = "(-" ++ show e ++ ")"
    show (x :+: y) = '(' : show x ++ "+" ++ show y ++ ")"
    show (x :-: y) = '(' : show x ++ "-" ++ show y ++ ")"
    show (x :*: y) = '(' : show x ++ "*" ++ show y ++ ")"
    show (x :/: y) = '(' : show x ++ "/" ++ show y ++ ")"
    show (x :^: y) = '(' : show x ++ "^" ++ show y ++ ")"
    show (Sin x) = "sin(" ++ show x ++")"
    show (Cos x) = "cos(" ++ show x ++")"
    show (Tg x) = "tg(" ++ show x ++")"
    show (Cos2 x) = "cos2(" ++ show x ++")"
    show (Exp x) = "exp(" ++ show x ++")"
    show (Ln x) = "ln(" ++ show x ++")"
 
diff:: Expression -> Expression 
diff (X) = Const 1
diff (Const _) = Const 0
 
diff (Sin X) = Cos X
diff (Sin x) = reduce $ Cos x :*: diff(x)
 
diff (Cos X) = Neg (Sin X)
diff (Cos x) = reduce $ Neg(Sin x) :*: diff(x)
 
diff (Tg X) =  reduce $ (Const 1) :/: (Cos2 X)
diff (Tg x) =  reduce $ (reduce $ (Const 1) :/: (Cos2 x)) :*: diff(x)
 
diff (Exp X) = Exp X
diff (Exp x) = reduce $ Exp x :*: diff(x)
 
diff (Ln X) = (Const 1) :/: X
diff (Ln x) = reduce $ (reduce $ (Const 1) :/: x):*:diff(x)
 
 
diff ( X :^: Const n) = reduce $ (Const n):*:(reduce $ X :^: (Const(n-1))) 
diff ( y :^: Const n) = reduce $ (reduce $ (Const n) :*: y) :*:diff (y)
 
diff (Const n :*: X) = Const n
-- Так не пойдёт. Можно было бы добавить скобки, но вариант лишний.
--diff (Const n :*:  X :^: Const n2) = Const (n*n2) :*:( X :^: Const (n2-1))
diff (x :*: y) = reduce $ (reduce $ (diff x):*:y) :+: (reduce $  x :*:(diff y))
 
diff (x :/: y) = reduce $ (reduce $ (reduce $ diff(x):*:y):-:(reduce $  x :*:(diff(y)))):/:(reduce $  y:^: (Const 2))
 
diff ( x :+: y) = reduce $ (diff x):+:(diff y)
 
diff ( x :-: y) = reduce $ (diff x):-:(diff y)
 
reduce ( (Const x) :+: (Const y)) = Const $ x+y
reduce ( (Const x) :-: (Const y)) = Const $ x-y
reduce ( (Const x) :*: (Const y)) = Const $ x*y
reduce ( (Const x) :^: (Const y)) = Const $ x^y
reduce ( Neg (Const x)) = Const $ (-x)
reduce ( (Const 0) :+: y) = y
reduce ( x :+: (Const 0)) = x
reduce ( (Const 0) :*: _) = Const 0
reduce ( _ :*: (Const 0)) = Const 0
reduce ( (Const 1) :*: y) = y
reduce ( x :*: (Const 1)) = x
reduce ( (Const (-1)) :*: y) = Neg y
reduce ( x :*: (Const (-1))) = Neg x
reduce ( x :-: (Const 0)) = x
reduce ( (Const 0) :-: y) = Neg y
reduce ( x :/: (Const 1)) = x
reduce ( x :^: (Const 1)) = x
reduce ( (Const 1) :^: _ ) = Const 1
reduce ( (Const 0) :^: _ ) = Const 0
reduce (e) = e
 
main:: IO ()  
main = do
    putStrLn "Enter an expression in the form of \
    \(Sin(Const 1 :/: X)) :*: (Exp ((X :^: (Const 3)) :-: (Const 3))) means that sin(1/x)*exp(x^3-2)" 
    hFlush stdout
    s <- getLine
    print $ diff $ read s
2
15.01.2015, 13:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2015, 13:36
Помогаю со студенческими работами здесь

упростить алгебраическое выражение
Решите пожалуйста задания 6 и 7

Упростить алгебраическое выражение
Помогите пожалуйста решить: Первое: ({x \over x^2-4}-{8 \over x^2+2x})*{x^2-2x \over 4-x}+ {x+8...

Вычислить алгебраическое выражение
Задание: Найдите значение выражение: 40-3a^2-3b^2 , где a и b - корни квадратного уравнения: ...

алгебраическое сложное выражение
((30*x^2)/(x^4+25))=3*x^2 +2√(5) +8

Записать алгебраическое выражение
Как записать в С++ √х sin x-z*y ?? Добавлено через 4 минуты Знаю что начало такое sqrt(x) *...

Упростить заданное алгебраическое выражение
Воспользовавшись законами алгебры множеств максимально упростить заданное алгебраическое выражение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru