Невозможно кодировать нелинейное уравнение в 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')

Должен решить вашу проблему:)

Другие вопросы по тегам