как использовать Fsolve без начала догадки - PullRequest
1 голос
/ 12 октября 2011

Хочу разработать настольное приложение для решения системы линейных и нелинейных уравнений.Я думаю использовать C # с Matlab.Я никогда не использовал matlab раньше, но я пытаюсь учиться для своего проекта.

Итак, я пытаюсь использовать fsolve и следую примеру, приведенному в документации по fsolve.

function F = myfun(x)
F = [2*x(1) - x(2) - exp(-x(1));
    -x(1) + 2*x(2) - exp(-x(2))];

**x0 = [-5; -5];           % Make a starting guess at the solution**
options=optimset('Display','iter');   % Option to display output
[x,fval] = fsolve(@myfun,x0,options)  % Call solver

Здесьв моем случае я не знаю начальную догадку, то есть x0

У меня просто n чисел уравнения с n неизвестным.Пожалуйста, объясните мне, что делать и как действовать.

Некоторые примеры уравнений:

a * b = 10^-14
(a * d)/c = 10^-6.3
(a * e)/d = 10^-10.3
.
.
.
c+d+e = 2.3 * 10^-3

1 Ответ

5 голосов
/ 12 октября 2011

fsolve использует численные методы для решения системы алгебраических уравнений - вам абсолютно необходимо первоначальное предположение, чтобы использовать fsolve.Если бы вы должны были решать уравнения аналитически, вам потребовалась бы линеаризация системы (если она была нелинейной, и обратите внимание, что это может или не может дать вам хорошие результаты), и вы могли бы использовать mldivide или LU факторизацию или какая-то другая матричная декомпозиция для быстрого решения системы Ax=b.

Вы можете потенциально использовать свой собственный метод поиска ограниченных корней (поиск по золотому сечению, параболическая интерполяция и т. Д.), Чтобы обойти тот факт, чтоВам нужно первоначальное предположение - компромисс здесь заключается в том, что (а) ограниченные методы поиска корней занимают больше времени, чем неограниченные методы, которые требуют начальных догадок;и (b) вам нужно убедиться, что ваше решение находится в пределах нижней и верхней границ.

Проще говоря, нет никакого способа численно определить набор уравнений и точно решить его аналитически, точно - вы должны либо решитьсистема аналитически (что может быть невозможным - если это так, я предлагаю Mathematica поверх MATLAB, если вам требуется, чтобы нелинейные системы работали без линеаризации), или вы должны довольствоваться указанием начального предположения или границ.

В физическомМотивированные, основанные на инженерных системах системы, которые я видел, вектор нуля обычно является достаточно хорошим предположением, но это не должно быть жестко закодировано - и если вы хотите решить любую произвольную систему, вы не должны заставлять пользователей использовать это в качестве начальногодумаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...