Невозможно кодировать нелинейное уравнение в MATLAB R2013a - MATLAB выдает предупреждение
Я хотел решить следующее уравнение в MATLAB R2013a, используя Symbolic Math Toolbox.
(y/x)-(((1+r)^n)-1)/r=0 where y,x and n>3 are given and r is the dependent variable
Я попробовал себя и закодировал следующее:
f=solve('(y/x)-(((1+r)^n)-1)/r','r')
но поскольку решение для r не является точным, то есть оно сходится на последовательных итерациях, следовательно, MATLAB выдает предупреждение с сообщением
Warning: Explicit solution could not be found.
f =
[ empty sym ]
Как мне это написать?
2 ответа
Существует бесконечное число решений этого для неопределенного значения n > 3
и неизвестно r
, Я надеюсь, что это довольно ясно, почему - это эффективно просить все большее и большее количество корней (1+r)^n
, Вы можете найти решения для фиксированных значений n
, тем не мение. Обратите внимание, что как n
становится больше, появляется все больше и больше решений и, конечно, некоторые из них являются сложными. Я собираюсь предположить, что вы заинтересованы только в реальных ценностях r
, Ты можешь использовать solve
и символическая математика для n = 4
, n = 5
, а также n = 6
(за n = 6
решение может быть не в удобной форме)
y = 441361;
x = 66990;
n = 5;
syms r;
rsol = solve(y/x-((1+r)^n-1)/r==0,r,'IgnoreAnalyticConstraints',true)
double(rsol)
Однако вопрос заключается в том, "нужны ли вам все решения или просто конкретное решение для данного значения n
"? Если вам просто нужно конкретное решение, вам вообще не следует использовать символическую математику, поскольку она медленнее и имеет практические проблемы, подобные тем, с которыми вы сталкиваетесь. Вместо этого вы можете просто использовать численный подход, чтобы найти ноль уравнения это близко к указанному начальному предположению. fzero
является стандартной функцией для решения такого рода проблемы в одной переменной:
y = 441361;
x = 66990;
n = 5;
f = @(r)y/x-((1+r).^n-1)./r;
r0 = 1;
rsol = fzero(f,r0)
Вы увидите, что возвращаемое значение совпадает с одним из решений из приведенного выше символического решения. Если вы корректируете первоначальное предположение r0
(сказать r0 = -3
), он вернет другое решение. При использовании числовых подходов в случаях, когда существует несколько решений, если вам нужны конкретные решения, вам нужно знать о поведении вашей функции, и вам нужно будет добавить некоторый умный дополнительный код для выбора начальных догадок.
Я думаю, что вы забыли также определить.
f=solve('(y/x)-(((1+r)^n)-1)/r=0','n-3>0','r','n')
Должен решить вашу проблему:)