Диагностируйте решения для уравнения от функции solve

Если solve возвращает решения, которые выглядят сложными, или если solve не может обработать вход, существует много опций. Эти опции упрощают пробел решения для solve. Эти опции также помогают solve, когда вход является сложным и может позволить solve возвращать решение, где это ранее застряло.

Возвратите только действительные решения

Решите уравнение x^5 - 1 == 0. Это уравнение имеет пять решений.

syms x
solve(x^5 - 1 == 0, x)
ans =
                                                     1
 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 - 5^(1/2)/4 - 1/4
   (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 - 5^(1/2)/4 - 1/4
   5^(1/2)/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*1i)/4 - 1/4
   5^(1/2)/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*1i)/4 - 1/4

Если вы только нуждаетесь в действительных решениях, задаете опцию Real как true. Функция solve возвращает одно действительное решение.

solve(x^5 - 1, x, 'Real', true)
ans =
1

Примените правила упрощения

Решите следующее уравнение. Функция solve возвращает сложное решение.

syms x
solve(x^(5/2) + 1/x^(5/2) == 1, x)
ans =
                                                       1/(1/2 - (3^(1/2)*1i)/2)^(2/5)
                                                       1/((3^(1/2)*1i)/2 + 1/2)^(2/5)
 -(5^(1/2)/4 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 1/4)/(1/2 - (3^(1/2)*1i)/2)^(2/5)
 -((2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 5^(1/2)/4 + 1/4)/(1/2 - (3^(1/2)*1i)/2)^(2/5)
 -(5^(1/2)/4 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 1/4)/(1/2 + (3^(1/2)*1i)/2)^(2/5)
 -((2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 5^(1/2)/4 + 1/4)/(1/2 + (3^(1/2)*1i)/2)^(2/5)

Чтобы применить правила упрощения при решении уравнений, задайте опцию IgnoreAnalyticConstraints как true. Прикладные правила упрощения не обычно правильны математически, но могут произвести полезные решения, особенно в физике и разработке. При использовании этой опции решатель не гарантирует правильности и полноты результата.

solve(x^(5/2) + 1/x^(5/2) == 1, x, 'IgnoreAnalyticConstraints', true)
ans =
 1/(1/2 - (3^(1/2)*1i)/2)^(2/5)
 1/((3^(1/2)*1i)/2 + 1/2)^(2/5)

Это решение более просто и более применимо.

Используйте предположения узким результатам

Для решений конкретных случаев, предположения набора, чтобы возвратить соответствующие решения. Решите следующее уравнение. Функция solve возвращает семь решений.

syms x
solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans =
                  1
      - 5^(1/2) - 1
 - 17^(1/2)/2 - 1/2
   17^(1/2)/2 - 1/2
         -5*2^(1/2)
          5*2^(1/2)
        5^(1/2) - 1

Примите, что x является положительным числом, и решите уравнение снова. Функция solve только возвращает четыре положительных решения.

assume(x > 0)
solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans =
                1
 17^(1/2)/2 - 1/2
        5*2^(1/2)
      5^(1/2) - 1

Поместите дополнительное предположение, что x является целым числом с помощью in(x,'integer'). Поместите дополнительные предположения в переменные с помощью assumeAlso.

assumeAlso(in(x,'integer'))
solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans =
1

solve возвращает единственное положительное, целочисленное решение x.

Очистите предположения на x для дальнейших вычислений путем воссоздания его с помощью syms.

syms x

Также, чтобы сделать несколько предположений, используйте оператор &. Сделайте следующие предположения и решите следующие уравнения.

syms a b c f g h y
assume(f == c & a == h & a~= 0)
S = solve([a*x + b*y == c, h*x - g*y == f], [x, y], 'ReturnConditions', true);
S.x
S.y
S.conditions
ans =
f/h
ans =
0
ans =
b + g ~= 0

Под заданными предположениями решением является x = f/h и y = 0 при условии b + g ~= 0.

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

syms a c f h

Упростите решения

Функция solve не вызывает функции упрощения для конечных результатов. Чтобы упростить решения, вызовите simplify.

Решите следующее уравнение. Преобразуйте числа в символьные числа с помощью sym, чтобы возвратить символьный результат.

syms x
S = solve((sin(x) - 2*cos(x))/(sin(x) + 2*cos(x)) == 1/2, x)
S =
 -log(-(- 140/37 + 48i/37)^(1/2)/2)*1i
  -log((- 140/37 + 48i/37)^(1/2)/2)*1i

Вызовите simplify, чтобы упростить решение S.

simplify(S)
ans =
        -log(37^(1/2)*(- 1/37 - 6i/37))*1i
 log(2)*1i - (log(- 140/37 + 48i/37)*1i)/2

Вызовите simplify с большим количеством шагов, чтобы упростить результат еще больше.

simplify(S, 'Steps', 50)
ans =
 atan(6) - pi
      atan(6)

Советы

  • Чтобы представлять номер точно, используйте sym, чтобы преобразовать номер в объект с плавающей точкой. Например, используйте sym(13)/5 вместо 13/5. Это представляет 13/5 точно вместо того, чтобы преобразовать 13/5 в число с плавающей запятой. Для большого количества поместите номер в кавычки. Сравните sym(13)/5, sym(133333333333333333333)/5 и sym('133333333333333333333')/5.

    sym(13)/5
    sym(133333333333333333333)/5
    sym('133333333333333333333')/5
    ans =
    13/5
    ans =
    133333333333333327872/5
    ans =
    133333333333333333333/5

    Размещение номера в кавычках и использование sym обеспечивают самую высокую точность.

  • Если возможно, упростите систему уравнений вручную перед использованием solve. Попытайтесь сократить количество уравнений, параметров и переменных.