Я использую Matlab, чтобы найти корни нелинейной функции. Уравнение длинное, и я использовал еще один .m
для сохранения функции, код которой выглядит так:
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)
Как я могу решить эту проблему?
ИЗМЕНИТЬ:
У уравнения есть по крайней мере один корень, потому что, если я использую ezplot
для построения графика функции, я получаю следующий рисунок.
fzero.m
есть одна строка, в которой естьisfinite
. Эта строка выглядит какif any(~isfinite([fa fb])) || any(~isreal([fa fb]))
- person India Slaver   schedule 02.12.2014function x_c = equation = XB - XA + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj);
также не может быть запущена. Могу я спросить вас, что вы хотите сделать? У вас есть файл функции, который принимает входные данные и дает выходные данные, из которых вы хотите найти корень? - person patrik   schedule 02.12.2014syms x; function x_c = equation = XB - XA + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj);
должно давать ошибку компиляции. В-третьих, действительно ли здесь требуется символьный набор инструментов? - person patrik   schedule 02.12.2014fzero
. Если я используюdisp(x_c)
, это показывает мне то большое уравнение, которое я пытаюсь решить. - person India Slaver   schedule 02.12.2014syms x; function x_c = equation = XB - XA + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj);
не может быть таким, каким он выглядит, потому что это дает ошибку компиляции. Ключевое словоfunction
так не работает! Кроме того,x_c = equation = XB...
не является правильным синтаксисом. Если вам нужна помощь, пожалуйста, дайте пример кода, который работает. У меня есть идея, в чем проблема, но если я точно не знаю, как вы получаете ошибку, я не смогу вам помочь. Я мог бы сказать, что вам нужно переписать код совершенно по-другому, который работает, но я предполагаю, что это не ваш вариант. - person patrik   schedule 02.12.2014x_c = equation = XB...
здесь был ошибкой. Я этого не заметил. Хотя в моем коде это правильно. Есть 5 файлов кода. Мне их всех сюда выложить? Или я могу связаться с вами в другом месте? Пожалуйста, помогите мне! - person India Slaver   schedule 02.12.2014