Решая одну задачу по теме механики жидкости, я столкнулся с ситуацией, когда мне нужно решить 4 нелинейных уравнения, чтобы получить 4 значения неизвестных переменных. Итак, я использовал функцию fsolve в Scilab для решения уравнений. Мой код выглядит следующим образом:
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, неверна.
в строке 17 исполняемого файла, вызываемого:
exec('D:\Desktop files\Ajith\TBC\SCILAB code\Chapter_08\fsolve.sce', -1)
Подробности вопроса: -
Актуальный вопрос: Нагретый воздух при 1 атм и температуре 35 градусов Цельсия транспортируется по круглому пластиковому воздуховоду длиной 150 метров со скоростью 0,35 м3/с. Определите минимальный диаметр воздуховода, если потеря напора в трубе не превышает 20 м?
Название книги: Механика жидкости: основы и приложения, авторы Я.А.Ценгель и Дж.М.Цимбала.
Номер страницы и вопроса: Номер страницы: 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.
Мои мысли об ошибке:
После прочтения описания задачи в книге есть только одно нетривиальное уравнение (третье) все остальные дают напрямую другие неизвестные как функции от 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)
Спасибо, сэр, Моттле, за то, что поделились своими знаниями. Я использую версию SCILAB 5.5.2. После того, как я изменил код, добавив поперечное в код, добавив транспонирование в код, я получил вывод без ошибок, но я не ожидал output.Code очень чувствителен к начальному значению, при изменении начального значения мой ответ становится другим, иногда дает ту же ошибку, упомянутую в вопросе. А как насчет функции Джейкоба, сэр, она тоже должна быть матрицей-столбцом или нет? Или несколько раз одни и те же начальные значения отображаются как ответ, который на самом деле неверен. В любом случае спасибо за ваш ответ, сэр ..!