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