Диагностируйте решения для уравнения от 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. Попытайтесь сократить количество уравнений, параметров и переменных.