Я использую Matlab для поиска корней нелинейной функции. Уравнение является длительным, и я использовал другой .m
, чтобы сохранить функцию, то код, который идет какКорни нелинейного уравнения с использованием Matlab
function x_c = f_x_c(s,H,VA,Lo,qc,EA,NF,Sj,Fj)
if (s < 0) || (s > Lo);
disp('The value of s is invalid')
disp(['s = ' num2str(s)]);
return
end
C1 = H/qc;
if NF == 0
n = 0;
sn = 0;
sum_Fj = 0;
end
if NF >= 1
Sj_Q = [0; Sj; Lo];
%Determine n and sn if 0 <= s < Lo:
if s < Lo
STOP = 0;
k = 0;
while STOP == 0
k = k + 1;
if (s >= Sj_Q(k,1)) && (s < Sj_Q((k + 1),1))
STOP = 1;
end
end
n = k - 1;
sn = Sj_Q(k,1);
end
%Determine n and sn if s = Lo:
if s == Lo
n = NF;
sn = Sj(NF,1);
end
sum_Fj = sum(Fj(1:n,1));
end
x_c = (H/EA)*s;
x_c = x_c + C1*asinh((qc*s - VA + sum_Fj)/H) + ...
- C1*asinh((qc*sn - VA + sum_Fj)/H);
for j = 1:n
sk = Sj_Q((j + 1),1);
sk_1 = Sj_Q(j,1);
sum_Fj = sum(Fj(1:(j - 1)));
x_c = x_c + ...
+ C1*asinh((qc*sk - VA + sum_Fj)/H) + ...
- C1*asinh((qc*sk_1 - VA + sum_Fj)/H);
end
переменная H
здесь. Нет проблем с кодом, потому что он возвращает мне это длинное уравнение, когда я ввожу следующее в основной файл.
syms x
equation = -(XB - XA) + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj); %Replaced H with variable H and all other arguments are pre-defined
Теперь, я хочу решить это уравнение около H0
. Когда я поставил fzero(@(x)equation, H0)
, он дает мне ошибку, которая идет как
Undefined function 'isfinite' for input arguments of type 'sym'.
Error in fzero (line 308)
elseif ~isfinite(fx) || ~isreal(fx)
Error in main (line 50)
fzero(@(x)equation, H0)
Как я могу решить эту проблему?
EDIT:
уравнение имеет хотя бы один корень, потому что, если я использую ezplot
построить функцию, я получаю следующую цифру.
@patrik Нет, у меня нет такой переменной. Фактически, в 'fzero.m' есть одна строка, которая имеет' isfinite'. Эта строка имеет вид 'if any (~ isfinite ([fa fb])) || any (~ isreal ([fa fb])) ' –
Извините, мой плохой. Однако я попытался воспроизвести ошибку с более простой функцией, но в настоящее время я не могу воспроизвести ошибку. Строка 'function x_c = equation = XB - XA + f_x_c (s, x, VA, Lo, qc, EA, NF, Sj, Fj);' также не может быть выполнена. Могу я спросить вас, что вы хотите сделать? У вас есть файл функции, который принимает входные данные и дает результат, на который вы хотите найти корень? – patrik
@patrik Да, Sj и Fj должны быть матрицами в функции, поэтому ваш код может не работать. Код слишком большой! Вы хотите, чтобы я опубликовал все это здесь? –