Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Printemps
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 8
1

Написать программу символьного дифференцирования многочлена от одной переменной

17.06.2014, 18:47. Просмотров 930. Ответов 3
Метки нет (Все метки)

Помогите написать программу символьного дифференцирования многочлена от одной переменной.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2014, 18:47
Ответы с готовыми решениями:

Опишите функцию символьного дифференцирования
{D}_{x}(x) = 1;<br/>{D}_{x}(y) = 0,\: y \neq x<br/>{D}_{x}({e}_{1} + {e}_{2}) =...

Написать программу символьного дифференцирования дробно-рациональной функции
Доброго времени суток.Заранее благодарю всех,кто читает эту тему.Пришла пора зачётов и нужно...

Напишите программу для дифференцирования многочлена
Здравствуйте прошу пожалуйста помощи в задании.. Используйте линейный список для представления...

Символьное дифференцирование многочлена от одной переменной
Помогите написать программу символьного дифференцирования многочлена от одной переменной....

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

3
Catstail
Модератор
24552 / 12468 / 2275
Регистрация: 12.02.2012
Сообщений: 20,239
17.06.2014, 20:51 2
Лучший ответ Сообщение было отмечено Printemps как решение

Решение

Вот код (HomeLisp), который дифференцирует многочлены от одного переменного:

Lisp
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
;; Перевод полинома во внутреннюю форму
 
(defun input-poly (p &aux x res i f sign coef u)
  (setq coef 0)
  (setq sign 1)
  (setq u    0)
  (setq f    0)
  (setq x (explode p))
  (dolist (i x res) 
    (cond ((EQ i '+) (progn (when (and (= u 0) (= f 1)) (setq u 1))
                           (if (> f 0) (setq res (append res (list (list coef u))))
                                       (setq res (append res (list (list u 0)))))  
                           (setq sign 1)
                           (setq u 0)
                           (setq f 0)
                           (setq coef 0)))
          ((EQ i '-) (progn (when (and (= u 0) (= f 1)) (setq u 1))
                           (if (> f 0) (setq res (append res (list (list coef u))))
                                       (setq res (append res (list (list u 0)))))  
                           (setq sign -1)
                           (setq u 0)
                           (setq f 0)
                           (setq coef 0)))
          ((fixedp i) (setq u (+ i (* u 10))))
          ((EQ i 'x)   (progn  (when (= u 0) (setq u 1))
                              (setq f 1)
                              (setq coef (* sign u))  
                              (setq u 0)))
          ((EQ i '^) (setq f 2))))
  (cond ((= f 0) (setq res (append res (list (list (* sign u) 0)))))
        (t       (setq res (append res (list (list coef u)))))) 
  (qsort-b (remove '(0 0) res) #'(lambda (x y) (> (cadr x) (cadr y)))))
 
;; Перевод во внешнюю форму
 
(defun output-poly (x &aux i c p res)
   (dolist (i x (implode res))
      (setq c (car i))
      (setq p (cadr i))
      (when (and (> c 0) (not (null res))) (setq res (append res (list '+))))
      (when (< c 0) (setq res (append res (list '-))) (setq c (abs c)))
      (when (<> c 1) (setq res (append res (list c))))
      (cond ((> p 1) (setq res (append res (list 'x '^ p))))
            ((= p 1) (setq res (append res (list 'x)))))))
 
;; Упрощение полинома (приведение подобных)
 
(defun reduce-poly (x &aux i c p cc cp res lstp)
  (dolist (i x res)
      (setq cc 0)
      (setq p (cadr i))
      (dolist (j x t) 
         (setq cp (cadr j))
         (when (= cp p) (setq cc (+ cc (car j)))))
      (when (and (<> cc 0) (not (memb p lstp)))
       (setq res (append res (list (list cc p))))
       (setq lstp (cons p lstp)))))
 
;; Дифференцирование:
 
(defun diff-poly (p)
   (reduce-poly (mapcar #'(lambda (x) (list (* (car x) (cadr x)) (- (cadr x) 1))) p)))
 
;; Проверка:
 
(output-poly (input-poly '6x-7x^3+11x-34-x^2+x^3))
 
==> 34+11x+6x+11x-x^2+x^3-7x^3+x^3
 
(output-poly (reduce-poly (input-poly '6x-7x^3+11x-34-x^2+x^3)))
 
==> 34+28x-x^2-5x^3
 
(output-poly (diff-poly (input-poly '6x-7x^3+11x-34-x^2+x^3)))
 
==> 28-2x-15x^2
4
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
17.06.2014, 21:00 3
Catstail, В чем смысл задания коэффициентов атомом? Не считаете что это противоречит сути атома как "неделимой частицы"?
0
Catstail
Модератор
24552 / 12468 / 2275
Регистрация: 12.02.2012
Сообщений: 20,239
18.06.2014, 15:13 4
Лучший ответ Сообщение было отмечено Printemps как решение

Решение

Оп! Сам вижу ошибки!

Добавлено через 1 минуту
Цитата Сообщение от castorsky Посмотреть сообщение
Catstail, В чем смысл задания коэффициентов атомом? Не считаете что это противоречит сути атома как "неделимой частицы"?
- это вопрос философский... Во всяком случае это никому не мешает. Можно было использовать строковое представление. Проблема в том, что у меня ошибка... Сейчас буду править.

Добавлено через 17 минут
Ой... Ошибка в функции qsort-b. Правильно так:

Lisp
1
2
3
4
5
(defun qsort-b (x fkey) 
   (COND ((NULL x) NIL) 
            (T (APPEND (qsort-b (remove-if (FUNCTION (LAMBDA (z) (FUNCALL fkey z (CAR x)))) (CDR x)) fkey)
                            (LIST (CAR x)) 
                            (qsort-b (remove-if-not (FUNCTION (LAMBDA (z) (FUNCALL fkey z (CAR x)))) (CDR x)) fkey)))))
Тепрь хорошо:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(output-poly (reduce-poly (input-poly '6x-7x^3+11x-34-x^2+x^3)))
 
==> 34+17x-x^2-6x^3 ;; с приведением подобных
 
(output-poly (input-poly '6x-7x^3+11x-34-x^2+x^3))
 
==> 34+11x+6x-x^2+x^3-7x^3 ;; без приведения
 
(output-poly (diff-poly (input-poly '6x-7x^3+11x-34-x^2+x^3)))
 
==> 17-2x-18x^2 ;; производная
Добавлено через 17 часов 52 минуты
Исправил еще пару мелких ошибок и добавил "до кучи" сложение, вычитание и умножение полиномов:

Кликните здесь для просмотра всего текста

Lisp
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
(defun input-poly (p &aux x res i f sign coef u)
  (setq coef 0)
  (setq sign 1)
  (setq u    0)
  (setq f    0)
  (setq x (explode p))
  (dolist (i x res) 
    (cond ((EQ i '+) (progn (when (and (= u 0) (= f 1)) (setq u 1))
                           (if (> f 0) (setq res (append res (list (list coef u))))
                                       (setq res (append res (list (list u 0)))))  
                           (setq sign 1)
                           (setq u 0)
                           (setq f 0)
                           (setq coef 0)))
          ((EQ i '-) (progn (when (and (= u 0) (= f 1)) (setq u 1))
                           (if (> f 0) (setq res (append res (list (list coef u))))
                                       (setq res (append res (list (list u 0)))))  
                           (setq sign -1)
                           (setq u 0)
                           (setq f 0)
                           (setq coef 0)))
          ((fixedp i) (setq u (+ i (* u 10))))
          ((EQ i 'x)   (progn  (when (= u 0) (setq u 1))
                              (setq f 1)
                              (setq coef (* sign u))  
                              (setq u 0)))
          ((EQ i '^) (setq f 2))))
  (cond ((= f 0) (setq res (append res (list (list (* sign u) 0)))))
        (t       (setq res (append res (list (list coef f)))))) 
  (qsort-b (remove '(0 0) res) #'(lambda (x y) (> (cadr x) (cadr y)))))
 
;; --------------------------------------------------------------------------
 
(defun output-poly (x &aux i c p res)
   (dolist (i x (implode res))
      (setq c (car i))
      (setq p (cadr i))
      (when (and (> c 0) (not (null res))) (setq res (append res (list '+))))
      (when (< c 0) (setq res (append res (list '-))) (setq c (abs c)))
      (when (and (= c 1) (null res)) (setq res (append res (list 1))))
      (when (<> c 1) (setq res (append res (list c))))
      (cond ((> p 1) (setq res (append res (list 'x '^ p))))
            ((= p 1) (setq res (append res (list 'x)))))))
 
;; --------------------------------------------------------------------------
 
(defun reduce-poly (x &aux i c p cc cp res lstp)
  (dolist (i x (qsort-b res #'(lambda (x y) (> (cadr x) (cadr y)))))
      (setq cc 0)
      (setq p (cadr i))
      (dolist (j x t) 
         (setq cp (cadr j))
         (when (= cp p) (setq cc (+ cc (car j)))))
      (when (and (<> cc 0) (not (memb p lstp)))
       (setq res (append res (list (list cc p))))
       (setq lstp (cons p lstp)))))
 
;; --------------------------------------------------------------------------
 
(defun diff-poly (p)
   (reduce-poly (mapcar #'(lambda (x) (list (* (car x) (cadr x)) (- (cadr x) 1))) p)))
 
;; --------------------------------------------------------------------------
 
(defun summ-poly (p1 p2)
  (reduce-poly (append p1 p2)))  
 
;; --------------------------------------------------------------------------
  
(defun sub-poly (p1 p2)
  (reduce-poly (append p1 (mapcar #'(lambda (x) (list (- (car x)) (cadr x))) p2))))               
 
;; --------------------------------------------------------------------------
  
(defun mult-poly (p1 p2 &aux r)
  (iter (for m1 in p1)
    (iter (for m2 in p2)
      (collecting (list (* (car m1) (car m2)) (+ (cadr m1) (cadr m2))) into r)))
  (reduce-poly r))
 
(defun test (n)
  (let ((p1 (input-poly '1+x))
        (p2 (input-poly '1+x)))
      (dotimes (i n (output-poly p1))
        (setq p1 (mult-poly p1 p2)))))


Вот тест (бином Ньютона):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(defun test (n)
  (let ((p1 (input-poly '1+x))
        (p2 (input-poly '1+x)))
      (dotimes (i (- n 1)(output-poly p1))
        (setq p1 (mult-poly p1 p2))))) 
 
==> test
 
(test 10)
 
==> 1+10x+45x^2+120x^3+210x^4+252x^5+210x^6+120x^7+45x^8+10x^9+x^10
 
(test 4)
 
==> 1+4x+6x^2+4x^3+x^4
 
(test 3)
 
==> 1+3x+3x^2+x^3
3
18.06.2014, 15:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2014, 15:13

Как подставить конкретные значения в результат символьного дифференцирования
Добрый день! Есть у меня функция F_V от нескольких переменных (V, m, n, h), я её символьно...

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru