我使用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)
錯誤我怎樣才能解決這個問題?
編輯:
方程至少有一個根,因爲如果我用ezplot
繪製功能,我得到如下圖所示。
@patrik不,我沒有任何這樣的變量。實際上,在'fzero.m'中,有一行有'isfinite'。該行如 '如果有(〜isfinite([fa fb]))||任何(〜isreal([fa fb]))' – 2014-12-02 08:37:23
對不起,我的壞。但是,我試圖用更簡單的函數重現錯誤,但是我目前無法重現錯誤。行'函數x_c = equation = XB -XA + f_x_c(s,x,VA,Lo,qc,EA,NF,Sj,Fj);'也不可運行。我能問你想做什麼嗎?你有一個函數文件,需要一個輸入,並給出一個輸出,你想找到的根? – patrik 2014-12-02 08:51:12
@patrik 是的,Sj和Fj應該是函數中的矩陣,這就是爲什麼你的代碼可能沒有運行。 代碼太大了!你想讓我在這裏發佈整個事情嗎? – 2014-12-02 08:54:23