1

Я решить систему нелинейных уравнений следующей функции:wSolving нелинейных уравнений с использованием fsolve в Matlab

function eq = ts_7(A,B,C,D,E) 
syms x 
% dbstop if error 

g = D * sin(C * atan(B*x - E * (B*x - atan(B*x)))) + A; % magic formula 
eq5 = taylor(g, x, 'Order',1, 'ExpansionPoint',7) + 4296; % x^0 
eq1 = taylor(g, x, 'Order',2, 'ExpansionPoint',7) - eq5 + 296.3; % x^1 
eq2 = taylor(g, x, 'Order',3, 'ExpansionPoint',7) - eq1 - 79.77; % x^2 
eq3 = taylor(g, x, 'Order',4, 'ExpansionPoint',7) - eq2 - 4.541; % x^3 
eq4 = taylor(g, x, 'Order',5, 'ExpansionPoint',7) - eq3 - 0.03358; % x^4 

eq{1} = matlabFunction(eq1) % syms to numeric function 
eq{2} = matlabFunction(eq2) 
eq{3} = matlabFunction(eq3) 
eq{4} = matlabFunction(eq4) 
eq{5} = matlabFunction(eq5) 
end 

и моя главная следующая

opts = optimoptions('fsolve','InitDamping',0.005,'Algorithm','levenberg-marquardt'); 
init = [-1.3, 1.4, 4000, 0.12, 9]; % starting points 
tic 
coeff = fsolve(@(x)ts_7(x(1), x(2), x(3), x(4), x(5)), init,opts); 
toc 

и ошибка Я продолжаю получать

Undefined function or variable "fuser".

Error in fsolve (line 257)
if ~isempty(isoptimargdbl('FSOLVE', {'F','J'}, fuser, JAC))

Error in script_7 (line 11)
coeff = fsolve(@(x)ts_7(x(1), x(2), x(3), x(4), x(5)), init,opts);

Error in run (line 96)
evalin('caller', [script ';']);

Я не знаю, как это исправить. Я также попытался решить ту же проблему с vpasolve и solve. Для solve это занимает слишком много времени и для vpasolve, я получаю ошибку, что символические параметры не допускаются в неполином уравнении.

Есть ли способ преобразовать строку в функцию (а не функцию дескриптора, что делает matlabFunction в этом коде)?

Я получаю отчаяние, потому что я не хочу переписывать все вручную.

ОБНОВЛЕНИЕ: Я пробовал решать двухмерную систему, пример от http://nl.mathworks.com/help/optim/ug/fsolve.html. Я получаю ту же ошибку, вот скриншот. enter image description here

ответ

2

Ваша функция ts_7 должна возвращать вектор с плавающей запятой, но eq - это массив ячеек функций. Вам также не нужно звонить matlabFunction пять раз. Вместо этого:

eq = matlabFunction([eq1;eq2;eq3;eq4;eq5]); 

Теперь eq функция ручки, которая возвращает 5-на-1 вектор-столбец двойников. Это должно быть численно в точке расширения x так, что выход ts_7 является точкой вектор плавающей, например:

eq = eq(1); 

Это не для меня ясно, что если вы также оптимизировать x или если вы знаете, это ,

+0

Я знаю x, это массив удвоений, 341x1. Скажем, у меня есть уравнение eq5 = taylor (g, x, 'Order', 1, 'ExpansionPoint', 7) + 4296 (x-7). Должен ли я передать x, или я просто установил его так, чтобы (x-7) = 1 и, таким образом, мы его нейтрализуем. – Lior

+0

Я попытался запустить код с вашей модификацией, но это не вектор-столбец, а дескриптор функции 1x1. Кроме того, я получаю ту же ошибку. Есть ли способ преобразования симсов в регулярную функцию, а не в функцию дескриптора? – Lior

+0

«Должен ли я передать x, или я просто установил его так, чтобы (x-7) = 1 и, таким образом, мы его нейтрализуем». - Я не знаю, какую проблему вы пытаетесь решить или что такое 'x', поэтому я не могу ответить на подобные вещи. – horchler

0

С моим MATLAB было что-то не так. Я решил проблему, используя другую версию MATLAB.

Смежные вопросы