在 scilab 中使用 fsolve 时如何克服 "Variable returned by scilab argument function is incorrect"?
How to overcome "Variable returned by scilab argument function is incorrect" while using fsolve in scilab?
在解决流体力学主题的一个问题时,我遇到了一种情况,我必须解决 4 个非线性方程才能得到 4 个未知变量值。所以,我在 scilab 中使用 fsolve 函数来求解方程。我的代码如下:
clc
clear
function f=F(x)
f(1)=x(1)-(0.4458*x(2)^(-2))
f(2)=x(3)-(0.26936*x(2)*(-1))
f(3)=(2.616*x(2))-(x(4)*x(1)^2)
f(4)=(0.316/(x(3)^(1/4)))
endfunction
function j=jacob(x)
j(1,1)=1;j(1,2)=0.8916*x(2)^(-3);j(1,3)=0;j(1,4)=0
j(2,1)=0;j(2,2)=0.26936*x(2)^(-2);j(2,3)=1;j(2,4)=0;
j(3,1)=-2*x(1)*x(4);j(3,2)=2.616;j(3,3)=0;j(3,4)=-1*x(1)^2;
j(4,1)=0;j(4,2)=0;j(4,3)=-2/x(3)/log(10);j(4,4)=(-0.5*x(4)^(-1.5))-(1/x(4)/log(10));
endfunction
x0=[1 1 2000 1];
[x,v,info]=fsolve(x0,F,jacob);
disp(x);
错误:
[x,v,信息]=fsolve(x0,F,jacob);
!--错误98
scilab 参数函数返回的变量不正确。
在由 :
调用的 exec 文件的第 17 行
执行('D:\Desktop files\Ajith\TBC\SCILAB code\Chapter_08\fsolve.sce', -1)
问题详情:-
真题:1个大气压和35摄氏度的热空气将在150米长的圆形塑料管道中以0.35m3/s的速率输送。如果管道水头损失不超过20m,确定风管的最小直径?
书名: 流体力学:基础与应用作者 Y.A.Cengel 和 J.M.Cimbala。
页码和题号: 页码:345,示例 8-4
本书的 ISBN: 0-07-247236-7
教科书link:https://www.academia.edu/32439502/Cengel_fluid_mechanics_6_edition.PDF
在我的代码中:x(1) 是速度,x(2) 是直径,x(3) 是雷诺数,x(4) 是摩擦系数
预期答案:x(1)=6.24,x(2)=0.267,x(3)=100800,x(4)=0.0180。
我对这个错误的看法:
- 所看到的是,如果我改变变量的幂,例如从 0.5 到 2 或 -1.5 到 1,则会计算并显示答案。所以,问题出在所用变量的威力上。
- 还有 x 的初始值,我看到对于某些初始值没有错误,我得到了输出。
看了书上的问题描述,只有一个non-trivial方程(第三个)其他的直接给出其他未知数作为D
的函数。这是确定直径的代码:
function out=F(D)
V = 0.35/%pi/D^2*4;
Re = V*D/1.655e-5;
f = 20/(150/D*V^2/2/9.81);
out = 1/sqrt(f) + 2*log10(2.51/Re/sqrt(f));
endfunction
D0 = 1;
[D,v,info]=fsolve(D0,F);
disp(D)
在解决流体力学主题的一个问题时,我遇到了一种情况,我必须解决 4 个非线性方程才能得到 4 个未知变量值。所以,我在 scilab 中使用 fsolve 函数来求解方程。我的代码如下:
clc
clear
function f=F(x)
f(1)=x(1)-(0.4458*x(2)^(-2))
f(2)=x(3)-(0.26936*x(2)*(-1))
f(3)=(2.616*x(2))-(x(4)*x(1)^2)
f(4)=(0.316/(x(3)^(1/4)))
endfunction
function j=jacob(x)
j(1,1)=1;j(1,2)=0.8916*x(2)^(-3);j(1,3)=0;j(1,4)=0
j(2,1)=0;j(2,2)=0.26936*x(2)^(-2);j(2,3)=1;j(2,4)=0;
j(3,1)=-2*x(1)*x(4);j(3,2)=2.616;j(3,3)=0;j(3,4)=-1*x(1)^2;
j(4,1)=0;j(4,2)=0;j(4,3)=-2/x(3)/log(10);j(4,4)=(-0.5*x(4)^(-1.5))-(1/x(4)/log(10));
endfunction
x0=[1 1 2000 1];
[x,v,info]=fsolve(x0,F,jacob);
disp(x);
错误:
[x,v,信息]=fsolve(x0,F,jacob);
!--错误98
scilab 参数函数返回的变量不正确。
在由 :
调用的 exec 文件的第 17 行
执行('D:\Desktop files\Ajith\TBC\SCILAB code\Chapter_08\fsolve.sce', -1)
问题详情:-
真题:1个大气压和35摄氏度的热空气将在150米长的圆形塑料管道中以0.35m3/s的速率输送。如果管道水头损失不超过20m,确定风管的最小直径?
书名: 流体力学:基础与应用作者 Y.A.Cengel 和 J.M.Cimbala。
页码和题号: 页码:345,示例 8-4
本书的 ISBN: 0-07-247236-7
教科书link:https://www.academia.edu/32439502/Cengel_fluid_mechanics_6_edition.PDF
在我的代码中:x(1) 是速度,x(2) 是直径,x(3) 是雷诺数,x(4) 是摩擦系数
预期答案:x(1)=6.24,x(2)=0.267,x(3)=100800,x(4)=0.0180。
我对这个错误的看法:
- 所看到的是,如果我改变变量的幂,例如从 0.5 到 2 或 -1.5 到 1,则会计算并显示答案。所以,问题出在所用变量的威力上。
- 还有 x 的初始值,我看到对于某些初始值没有错误,我得到了输出。
看了书上的问题描述,只有一个non-trivial方程(第三个)其他的直接给出其他未知数作为D
的函数。这是确定直径的代码:
function out=F(D)
V = 0.35/%pi/D^2*4;
Re = V*D/1.655e-5;
f = 20/(150/D*V^2/2/9.81);
out = 1/sqrt(f) + 2*log10(2.51/Re/sqrt(f));
endfunction
D0 = 1;
[D,v,info]=fsolve(D0,F);
disp(D)