упрощение выражений

Форум, посвященный общим вопросам, связанным с MATLAB

Модератор: Admin

Fireman
Пользователь
Сообщения: 5
Зарегистрирован: Ср фев 06, 2019 1:12 am

упрощение выражений

Сообщение Fireman » Ср фев 06, 2019 1:24 am

Приветствую

Подскажите со следующим вопросом:
у меня есть определённое "многоэтажное" выражение, которое очень бы хотелось упростить
Изображение

Очень хотелось бы формулу вида a/b, т.е. двухуровневую (исходник 16уровневый) и очевидно что такая формула существует, пусть и длинная.

Если я использую коману simplify, то получаю 8уровневую упрощённу формулу, что меня не устраивает.

Подскажите как заставить mathlab сделать упрощённую 2уровневую формулу.

P.S.

сам формулу

Код: Выделить всё

t =

((((z_1 - z_2)/(x_1^2 - x_2^2) - (z_1 - z_3)/(x_1^2 - x_3^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_3)/(x_1^2 - x_3^2)) - ((z_1 - z_2)/(x_1^2 - x_2^2) - (z_1 - z_4)/(x_1^2 - x_4^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_4)/(x_1^2 - x_4^2)))/(((y_1^2 - y_2^2)/(x_1^2 - x_2^2) - (y_1^2 - y_3^2)/(x_1^2 - x_3^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_3)/(x_1^2 - x_3^2)) - ((y_1^2 - y_2^2)/(x_1^2 - x_2^2) - (y_1^2 - y_4^2)/(x_1^2 - x_4^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_4)/(x_1^2 - x_4^2))) - (((z_1 - z_2)/(x_1^2 - x_2^2) - (z_1 - z_3)/(x_1^2 - x_3^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_3)/(x_1^2 - x_3^2)) - ((z_1 - z_2)/(x_1^2 - x_2^2) - (z_1 - z_5)/(x_1^2 - x_5^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_5)/(x_1^2 - x_5^2)))/(((y_1^2 - y_2^2)/(x_1^2 - x_2^2) - (y_1^2 - y_3^2)/(x_1^2 - x_3^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_3)/(x_1^2 - x_3^2)) - ((y_1^2 - y_2^2)/(x_1^2 - x_2^2) - (y_1^2 - y_5^2)/(x_1^2 - x_5^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_5)/(x_1^2 - x_5^2))))/((((y_1 - y_2)/(x_1^2 - x_2^2) - (y_1 - y_3)/(x_1^2 - x_3^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_3)/(x_1^2 - x_3^2)) - ((y_1 - y_2)/(x_1^2 - x_2^2) - (y_1 - y_4)/(x_1^2 - x_4^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_4)/(x_1^2 - x_4^2)))/(((y_1^2 - y_2^2)/(x_1^2 - x_2^2) - (y_1^2 - y_3^2)/(x_1^2 - x_3^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_3)/(x_1^2 - x_3^2)) - ((y_1^2 - y_2^2)/(x_1^2 - x_2^2) - (y_1^2 - y_4^2)/(x_1^2 - x_4^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_4)/(x_1^2 - x_4^2))) - (((y_1 - y_2)/(x_1^2 - x_2^2) - (y_1 - y_3)/(x_1^2 - x_3^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_3)/(x_1^2 - x_3^2)) - ((y_1 - y_2)/(x_1^2 - x_2^2) - (y_1 - y_5)/(x_1^2 - x_5^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_5)/(x_1^2 - x_5^2)))/(((y_1^2 - y_2^2)/(x_1^2 - x_2^2) - (y_1^2 - y_3^2)/(x_1^2 - x_3^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_3)/(x_1^2 - x_3^2)) - ((y_1^2 - y_2^2)/(x_1^2 - x_2^2) - (y_1^2 - y_5^2)/(x_1^2 - x_5^2))/((x_1 - x_2)/(x_1^2 - x_2^2) - (x_1 - x_5)/(x_1^2 - x_5^2))))


Код: Выделить всё

simplify(t)


выдается такой результат:

Код: Выделить всё

ans =

(((x_1^2 z_2 - x_2^2 z_1 - x_1^2 z_3 + x_3^2 z_1 + x_2^2 z_3 - x_3^2 z_2)/((x_1 - x_2) (x_1 - x_3) (x_2 - x_3)) - (x_1^2 z_2 - x_2^2 z_1 - x_1^2 z_4 + x_4^2 z_1 + x_2^2 z_4 - x_4^2 z_2)/((x_1 - x_2) (x_1 - x_4) (x_2 - x_4)))/((x_1^2 y_2^2 - x_1^2 y_3^2 - x_2^2 y_1^2 + x_2^2 y_3^2 + x_3^2 y_1^2 - x_3^2 y_2^2)/((x_1 - x_2) (x_1 - x_3) (x_2 - x_3)) - (x_1^2 y_2^2 - x_1^2 y_4^2 - x_2^2 y_1^2 + x_2^2 y_4^2 + x_4^2 y_1^2 - x_4^2 y_2^2)/((x_1 - x_2) (x_1 - x_4) (x_2 - x_4))) - ((x_1^2 z_2 - x_2^2 z_1 - x_1^2 z_3 + x_3^2 z_1 + x_2^2 z_3 - x_3^2 z_2)/((x_1 - x_2) (x_1 - x_3) (x_2 - x_3)) - (x_1^2 z_2 - x_2^2 z_1 - x_1^2 z_5 + x_5^2 z_1 + x_2^2 z_5 - x_5^2 z_2)/((x_1 - x_2) (x_1 - x_5) (x_2 - x_5)))/((x_1^2 y_2^2 - x_1^2 y_3^2 - x_2^2 y_1^2 + x_2^2 y_3^2 + x_3^2 y_1^2 - x_3^2 y_2^2)/((x_1 - x_2) (x_1 - x_3) (x_2 - x_3)) - (x_1^2 y_2^2 - x_1^2 y_5^2 - x_2^2 y_1^2 + x_2^2 y_5^2 + x_5^2 y_1^2 - x_5^2 y_2^2)/((x_1 - x_2) (x_1 - x_5) (x_2 - x_5))))/(((x_1^2 y_2 - x_2^2 y_1 - x_1^2 y_3 + x_3^2 y_1 + x_2^2 y_3 - x_3^2 y_2)/((x_1 - x_2) (x_1 - x_3) (x_2 - x_3)) - (x_1^2 y_2 - x_2^2 y_1 - x_1^2 y_4 + x_4^2 y_1 + x_2^2 y_4 - x_4^2 y_2)/((x_1 - x_2) (x_1 - x_4) (x_2 - x_4)))/((x_1^2 y_2^2 - x_1^2 y_3^2 - x_2^2 y_1^2 + x_2^2 y_3^2 + x_3^2 y_1^2 - x_3^2 y_2^2)/((x_1 - x_2) (x_1 - x_3) (x_2 - x_3)) - (x_1^2 y_2^2 - x_1^2 y_4^2 - x_2^2 y_1^2 + x_2^2 y_4^2 + x_4^2 y_1^2 - x_4^2 y_2^2)/((x_1 - x_2) (x_1 - x_4) (x_2 - x_4))) - ((x_1^2 y_2 - x_2^2 y_1 - x_1^2 y_3 + x_3^2 y_1 + x_2^2 y_3 - x_3^2 y_2)/((x_1 - x_2) (x_1 - x_3) (x_2 - x_3)) - (x_1^2 y_2 - x_2^2 y_1 - x_1^2 y_5 + x_5^2 y_1 + x_2^2 y_5 - x_5^2 y_2)/((x_1 - x_2) (x_1 - x_5) (x_2 - x_5)))/((x_1^2 y_2^2 - x_1^2 y_3^2 - x_2^2 y_1^2 + x_2^2 y_3^2 + x_3^2 y_1^2 - x_3^2 y_2^2)/((x_1 - x_2) (x_1 - x_3) (x_2 - x_3)) - (x_1^2 y_2^2 - x_1^2 y_5^2 - x_2^2 y_1^2 + x_2^2 y_5^2 + x_5^2 y_1^2 - x_5^2 y_2^2)/((x_1 - x_2) (x_1 - x_5) (x_2 - x_5))))


sandy
Эксперт
Сообщения: 5525
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: упрощение выражений

Сообщение sandy » Чт фев 07, 2019 12:17 am

Попробуйте функцию simplifyFraction
С уважением

Александр Сергиенко

Fireman
Пользователь
Сообщения: 5
Зарегистрирован: Ср фев 06, 2019 1:12 am

Re: упрощение выражений

Сообщение Fireman » Чт фев 07, 2019 1:04 pm

Пока в отъезде, в субботу опробуют все предложенные способы

Подумалось - а не сработает ли многошаговое упрощение, типа

Код: Выделить всё

simplify(t, "Steps", 100)


?

Fireman
Пользователь
Сообщения: 5
Зарегистрирован: Ср фев 06, 2019 1:12 am

Re: упрощение выражений

Сообщение Fireman » Сб фев 09, 2019 10:54 pm

sandy писал(а):Попробуйте функцию simplifyFraction

Огромное спасибо, сработало
Получилось выражение вида a/b - как раз то, что нужно

А не подскажешь со второй проблемой:
Я хочу произвести замены

Код: Выделить всё

syms d_x
syms d_y


x_2 = x_1 - d_x
y_2 = y_1

x_3 = x_1 + d_x
y_3 = y_1

x_4 = x_1
y_4 = y_1 - d_y

x_5 = x_1
y_5 = y_1 + d_y


в результате вместо результата выдается NaN

Если же я беру отдельно a и b из предыдущего результата и применяю к ним такие преобразования - то никаких Nan не возникает и получается корректное выражение

А потом я делаю a/b руками и опять корректное выражение вылезает
Откуда же тогда NaN изначально?

barkot
Пользователь
Сообщения: 55
Зарегистрирован: Вс янв 14, 2018 2:28 pm

Re: упрощение выражений

Сообщение barkot » Вс фев 10, 2019 9:16 am

а если так ?

Код: Выделить всё

t1=simplifyFraction(t);
subs(t1,{x2,y2,x3,y3,x4,y4,x5,y5},[x1-dx,y1,x1+dx,y1,x1,y1-dy,x1,y1+dy])

Fireman
Пользователь
Сообщения: 5
Зарегистрирован: Ср фев 06, 2019 1:12 am

Re: упрощение выражений

Сообщение Fireman » Пн фев 11, 2019 1:10 am

barkot писал(а):а если так ?

Код: Выделить всё

t1=simplifyFraction(t);
subs(t1,{x2,y2,x3,y3,x4,y4,x5,y5},[x1-dx,y1,x1+dx,y1,x1,y1-dy,x1,y1+dy])


Замечательно работает, но если делать так

Код: Выделить всё

subs(t,{x2,y2,x3,y3,x4,y4,x5,y5},[x1-dx,y1,x1+dx,y1,x1,y1-dy,x1,y1+dy])

т.е. если не делать начального упрощения, то выдает

Error using symengine
Division by zero.

Error in sym/subs>mupadsubs (line 160)
G = mupadmex('symobj::fullsubs',F.s,X2,Y2);

Error in sym/subs (line 145)
G = mupadsubs(F,X,Y);

Error in script (line 43)
res = subs(t, {x_2, y_2, x_3, y_3, x_4, y_4, x_5, y_5}, [x_1 - d_x, y_1, x_1 + d_x, y_1, x_1, y_1 - d_y, x_1, y_1 + d_y]);

sandy
Эксперт
Сообщения: 5525
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: упрощение выражений

Сообщение sandy » Пн фев 11, 2019 8:15 pm

Ну а чего вы хотите? Если сделать эти подстановки в вашем исходном выражении, действительно получается деление на ноль.
С уважением



Александр Сергиенко

Fireman
Пользователь
Сообщения: 5
Зарегистрирован: Ср фев 06, 2019 1:12 am

Re: упрощение выражений

Сообщение Fireman » Пн фев 11, 2019 11:06 pm

sandy писал(а):Ну а чего вы хотите? Если сделать эти подстановки в вашем исходном выражении, действительно получается деление на ноль.


кхм, действительно так, но это в общей записи, при сокращении этот эффект должен исчезнуть

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

а когда я привожу нижние замены - это 5 точек, расположенные на кресте, при разных z1..z5 там вообще деления на 0 не должно возникать

sandy
Эксперт
Сообщения: 5525
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: упрощение выражений

Сообщение sandy » Пн фев 11, 2019 11:43 pm

Fireman писал(а):при сокращении этот эффект должен исчезнуть

Ну так он и исчезает - ведь его нет, когда вы выполняете подстановку в упрощенном выражении t1. Не понимаю, что вам не нравится.
С уважением



Александр Сергиенко