Форум программистов, компьютерный форум, киберфорум
arch_m
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Выделение полного квадрата с помощью Mathematica

Запись от arch_m размещена 17.02.2020 в 15:53
Показов 5403 Комментарии 2

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

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

Зададим многочлен
q = a*x^2 + b*x + c;

Построим тест
qpQ[X_] := MemberQ[Exponent[X, Variables[X]], 2];

Проверим его в действии

{qpQ[q], qpQ[a], qpQ[4], qpQ[x^2 + 2 x + y^2]}

{qpQ[q], qpQ[a], qpQ[4], qpQ[x^2 + 2 x + y^2]}

{True, False, False, True}

Работает, как видно.

Построим теперь функцию извлекающую переменную.

var[X_] := Variables[X][[Position[Exponent[X, Variables[X]], 2][[1, 1]]]] /;qpQ[X]

Функция работает тогда, когда тест на квадратный многочлен удовлетворителен.
var[q]
x

Как видно, функция со своей задачей справляется.

Коэффициенты полинома находит встроенная функция
CoefficientList[q, var[q]]

{c, b, a}

Ну что-ж, все готово. Можно писать модуль.

fsq[X_] := Module[{sqtest, vr, cf, out},
sqtest := MemberQ[Exponent[X, Variables[X]], 2];
vr := Variables[X][[Position[Exponent[X, Variables[X]], 2][[1, 1]]]];
cf := CoefficientList[X, vr];
out := cf[[3]] (vr + Expand[cf[[2]]/(2 cf[[3]])])^2 +fsq[cf[[1]] - cf[[2]]^2/(4 cf[[3]])];
If[sqtest, out, X, X]
]

Проверим полученную функцию в действии.

fsq[q]
https://www.cyberforum.ru/cgi-bin/latex.cgi?a \left(\frac{b}{2 a}+x\right)^2+c-\frac{b^2}{4 a}

Работает как видно.

fsq[x^2 + 2 x + 5 y^2 + 6 y + 14]
https://www.cyberforum.ru/cgi-bin/latex.cgi?(x+1)^2+5 \left(y+\frac{3}{5}\right)^2+\frac{56}{5}

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

CreatePalette[
Button[Defer[fsq[\[SelectionPlaceholder]]], None,
BaseStyle -> "Evaluate", ImageSize -> {100, 25}]]

Можно, конечно, полученную функцию и кнопку оформить как пакет, но ... я воздержусь от этого.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    arch_m,
    А вы проверяли вашу программу на тот случай, если коэффициенты представлены в виде квадратов чисел? Ну например так x2 + 22x + 32
    Запись от wer1 размещена 17.02.2020 в 16:04 wer1 вне форума
  2. Старый комментарий
    Математика автоматически возведет коэффициенты в квадрат. Программа работает относительно неопределенных переменных.

    А вот что математика делает с таким выражением

    fsq[4^2*Sin[x]^2 + 5 Sin[x] + 25]

    https://www.cyberforum.ru/cgi-bin/latex.cgi?16 \left(\sin (x)+\frac{5}{32}\right)^2+\frac{1575}{64}

    Вот еще интересный случай.

    fsq[a^2*x^2 + 2 x + 4]

    https://www.cyberforum.ru/cgi-bin/latex.cgi?a^2 \left(\frac{1}{a^2}+x\right)^2-\frac{1}{a^2}+4

    Язык и функционал Математики специально заточен на решении символьных задач.
    Запись от arch_m размещена 17.02.2020 в 16:16 arch_m вне форума
 
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru