在scilab中使用fsolve时,如何克服“ scilab参数函数返回的变量不正确”?

时间:2019-06-14 05:00:34

标签: 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,info] = fsolve(x0,F,jacob);                               !-错误98 scilab参数函数返回的变量不正确。 在exec文件的第17行,由:
调用 exec('D:\ Desktop files \ Ajith \ TBC \ SCILAB code \ Chapter_08 \ fsolve.sce',-1)

问题的详细信息:-

实际问题: 1atm和35摄氏度的加热空气将以150m长的圆形塑料管道以0.35 m3 / s的速度传输。如果管道的水头损失不超过20m,请确定管道的最小直径?

书名:流体力学:Y.A。Cengel和J.M. Cimbala的基础知识和应用。

页面和问题编号:页面编号:345,示例8-4

该书的ISBN: 0-07-247236-7

教科书链接: 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。

我对错误的看法:

  1. 可以看到的是,如果我将变量的幂从0.5更改为2或从-1.5更改为1,则会计算并显示答案。因此,问题出在所使用变量的作用力附近。
  2. 同样,x的初始值,我看到对于某些初始值也没有错误,我得到了输出。

1 个答案:

答案 0 :(得分:0)

在阅读本书中对问题的描述之后,只有一个非平凡的方程式(第三个),所有其他方程式直接将其他未知数作为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)