1

에 fsolve를 I 갖고 이용한 비선형 방정식 :wSolving 다음 함수의 비선형 방정식의 시스템 해결 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 ';']);

나는 그것을 고치는 법을 모른다. 나는 또한 vpasolvesolve으로 같은 문제를 해결하려고 노력했다. solve은 너무 오래 걸리며 vpasolve은 비 폴리 방정식에서 기호 매개 변수가 허용되지 않는다는 오류가 발생합니다.

문자열을 함수로 변환 할 수있는 방법이 있습니까 (이 코드에서 matlabFunction이 처리하는 기능이 아님)?

나는 모든 것을 손으로 다시 쓰고 싶지 않기 때문에 필사적이다.

업데이트 : http://nl.mathworks.com/help/optim/ug/fsolve.html에서 2-D 시스템을 풀려고했습니다. 같은 오류가 발생했습니다. 여기 스크린 샷이 있습니다. enter image description here

답변

2

함수 ts_7은 부동 소수점 벡터를 반환해야하지만 eq은 함수 핸들의 셀 배열입니다. matlabFunction 번에 5 번을 부를 필요도 없습니다. 대신 :

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

지금 eq 복식의 5 별 1 열 벡터를 반환하는 함수 핸들입니다. 이 확장 포인트 x에서 수치 적으로 평가 될 필요가 ts_7의 출력 예를 들어 부동 소수점 벡터가되도록 :

당신은 또한 x을 최적화하는 경우 그것은 내게 분명하지 않다
eq = eq(1); 

또는 당신이 알고있는 경우 .

+0

나는 x를 안다. 이것은 341x1의 double 형 배열이다. 내가 방정식을 가지고 있다고 가정 해 봅시다. eq5 = taylor (g, x, 'Order', 1, 'ExpansionPoint', 7) + 4296 (x-7). x를 전달해야합니까, 아니면 (x-7) = 1이되도록 8로 설정하면 중화가됩니다. – Lior

+0

당신의 수정 코드를 실행하려고했지만 그것은 열 벡터가 아니라 1x1 함수 핸들입니다. 또한 같은 오류가 발생합니다. syms를 핸들 함수가 아닌 일반 함수로 변환하는 방법이 있습니까? – Lior

+0

"x를 넘겨야 만할까요, 아니면 8이되도록 (x-7) = 1이되도록 중화 할 수 있습니까?" - 당신이 해결하려고하는 문제 나'x'가 무엇인지 모릅니다. 그래서 나는 그런 종류의 대답에 대답 할 수 없습니다. – horchler

0

내 MATLAB에 문제가있었습니다. 다른 버전의 MATLAB을 사용하여이 문제를 해결했습니다.