Проблема с переводом кода с PascalABC.Net на JS

120
22 января 2022, 03:50

Доброго времени суток знатоки! У меня есть код на PascalABC, который я пытаюсь перевести на JS, я вроде ка его переделал, но ответы выходят разные, не могу понять в чем дело. Может кто помочь, выяснить в чем проблема, или хотя бы натолкнуть на решение. Буду благодарен! Ссылка на результат выполнение кода на Pascal: https://drive.google.com/open?id=1Wjy0KnodoWu3TcEJDKEridKqUbwujRpZ Код на PascalABC

uses crt;
const mf=500;
type
vector=array[1..mf] of real;
var {раздел описания переменных, которые мы будем использовать в
программе}
i, j, N : integer;
T, alfa, beta : vector;
ai, bi, ci, fi : real;
a, lamda, ro, c, h, tau : real;
kapa1, kapa2, Te1, Te2 : real;
T0, L, t_end, time : real;
f, g : text;
begin
clrscr;
{с клавиатуры вводим все необходимые входные параметры}
Writeln('Введите количество пространственных узлов, N');
Readln(N);
Writeln('Введите окончание по времени, t_end');
Readln(t_end);
Writeln('Введите толщину пластины, L');
Readln(L);
Writeln('Введите коэффициент теплопроводности материала пластины,lamda');
Readln(lamda);
Writeln('Введите плотность материала пластины, ro');
Readln(ro);
Writeln('Введите теплоемкость материала пластины, c');
Readln(c);
Writeln('Введите коэффициент теплообмена на границе х = 0, kapa1');
Readln(kapa1);
Writeln('Введите коэффициент теплообмена на границе х = L, kapa2');
Readln(kapa2);
Writeln('Введите температуру внешней среды относительно границы х= 0, Te1');
Readln(Te1);
Writeln('Введите температуру внешней среды относительно границы х= L, Te2');
Readln(Te2);
Writeln('Введите начальную температуру, T0');
Readln(T0);
{определяем расчетный шаг сетки по пространственной координате}
h:=L/(N-1);
{определяем коэффициент температуропроводности}
a:=lamda/(ro*c);
{определяем расчетный шаг сетки по времени}
tau:=t_end/100.0;
{определяем поле температуры в начальный момент времени}
for i:= 1 to N do
T[i]:=T0;
Writeln('beta = ', (lamda*sqr(h)*T[1]+2.0*a*tau*kapa1*h*Te1)
/(2.0*a*tau*(lamda+kapa1*h)+lamda*sqr(h)));
{проводим интегрирование нестационарного уравнения
теплопроводности}
time:=0;
while time<t_end do {используем цикл с предусловием}
begin
{увеличиваем переменную времени на шаг τ}
time:=time+tau;
{определяем начальные прогоночные коэффициенты на основе левого
граничного условия, используя соотношения (24)}
alfa[1]:=2.0*a*tau*lamda/(2.0*a*tau*(lamda+kapa1*h)+lamda*sqr(h));
beta[1]:=(lamda*sqr(h)*T[1]+2.0*a*tau*kapa1*h*Te1)
/(2.0*a*tau*(lamda+kapa1*h)+lamda*sqr(h));
{цикл с параметром для определения прогоночных коэффициентов по
формуле (8)}
for i:= 2 to N-1 do
begin
{ai, bi, ci, fi – коэффициенты канонического представления СЛАУ с
трехдиагональной матрицей}
ai:=lamda/sqr(h);
bi:=2.0*lamda/sqr(h)+ro*c/tau;
ci:=lamda/sqr(h);
fi:=-ro*c*T[i]/tau;
{alfa[i], beta[i] – прогоночные коэффициенты}
alfa[i]:=ai/(bi-ci*alfa[i-1]);
beta[i]:=(ci*beta[i-1]-fi)/(bi-ci*alfa[i-1]);
end;
{определяем значение температуры на правой границе, используя
соотношение (25)}
T[N]:=(lamda*sqr(h)*T[N]+2.0*a*tau*(lamda*beta[N-1]+kapa2*h*Te2))
/(lamda*sqr(h)+2.0*a*tau*(lamda*(1-alfa[N-1])+kapa2*h));
{используя соотношение (7) определяем неизвестное поле
температуры}
for i:= N-1 downto 1 do
T[i]:=alfa[i]*T[i+1]+beta[i];
end; {цикл с предусловием окончен}
{выводим результат в файл}
Assign(f,'res.txt');
Rewrite(f);
Writeln(f,'Толщина пластины L = ',L:6:4);
Writeln(f,'Число узлов по координате N = ',N);
Writeln(f,'Коэффициент теплопроводности материала пластины lamda =',lamda:6:4);
Writeln(f,'Плотность материала пластины ro = ',ro:6:4);
Writeln(f,'Теплоемкость материала пластины с = ',c:6:4);
Writeln(f,'Начальная температура T0 = ',T0:6:4);
Writeln(f,'Коэффициент теплообмена kapa1 = ',kapa1:6:4);
Writeln(f,'Коэффициент теплообмена kapa2 = ',kapa2:6:4);
Writeln(f,'Температура внешней среды Te1 = ',Te1:6:4);
Writeln(f,'Температура внешней среды Te2 = ',Te2:6:4);
Writeln(f,'Результат получен с шагом по координате h = ',h:6:4);
Writeln(f,'Результат получен с шагом по времени tau = ',tau:6:4);
Writeln(f,'Температурное поле в момент времени t = ',t_end:6:4);
close(f);
Assign(g,'tempr.txt');
Rewrite(g);
for i:=1 to N do
writeln(g,' ',h*(i-1):10:8,' ',T[i]:8:5);
close(g);
end.

Мой код на JS


    let N = 50;
    let i,j;
    let T = [], alfa = [], beta = [];
    let ai, bi, ci, fi;
    let a, lamda, ro, c, h, tau;
    let kapa1, kapa2, Te1, Te2;
    let T0, L, t_end, time;
    t_end = 180.0000;
    L = 0.3000;
    lamda = 384.000;
    ro = 8800.000;
    c = 381.000;
    kapa1 = 1000.000;
    kapa2 = 500.000;
    Te1 = -30.000;
    Te2 = 10.00;
    T0 = 50.000;
    h = L / (N - 1);
    a = lamda / (ro * c);
    tau = t_end / 100.0;
    for(i = 0; i < N; i++) {
        T[i] = T0;
    }
    console.log(T);
    let Bi = (kapa1 * h) / lamda;
    time = 0.0;
    while(time < t_end) {
        time = time + tau;
        alfa[0] = (2 * a * tau * lamda) / (2 * a * tau * (lamda + kapa1*h) + lamda * Math.pow(h,2));
        beta[0] = (lamda * Math.pow(h,2) * T[0] + 2 * a * tau * kapa1 * h * Te1) /
                   (2 * a * tau * (lamda + kapa1 * h) + lamda * Math.pow(h,2)); 
        for (i = 1; i < N - 1; i++) {
            ai = lamda / h ** 2;
            bi = 2 * lamda / h ** 2 + ro * c / tau;
            ci = lamda / h ** 2;
            fi = - ro * c * T[i] / tau;
            alfa[i] = ai / (bi - ci * alfa[i -1]);
            beta[i] = (ci * beta[i - 1] - fi) / (bi - ci * alfa[i-1]);
        }
        T[N] = (lamda * h ** 2 * T[N] + 2 * a * tau * (lamda * beta[N-1] + kapa2*h*Te2))/
                (lamda * h ** 2 + 2 * a * tau * (lamda * (1 - alfa[N-1] + kapa2 * h)));
        for(i = N - 1; i > 0; i--) {
            T[i] = alfa[i] * T[i] + beta[i];
        }
    }

ТО что выводиться в файл на Pascal ТО что я получаю на JS]2

Answer 1

Спасибо всем, кто натолкнул на решение проблемы! На всякий случай оставлю тут, мало кому понадобиться

function test() {
    let N = 50;
    let i,j;
    let T = [], alfa = [], beta = [];
    let ai, bi, ci, fi;
    let a, lamda, ro, c, h, tau;
    let kapa1, kapa2, Te1, Te2;
    let T0, L, t_end, time;
    t_end = 180.0000;
    L = 0.3000;
    lamda = 384.000;
    ro = 8800.000;
    c = 381.000;
    kapa1 = 1000.000;
    kapa2 = 500.000;
    Te1 = -30.000;
    Te2 = 10.00;
    T0 = 50.000;
    h = L / (N - 1);
    a = lamda / (ro * c);
    tau = t_end / 100.0;
    for(i = 0; i < N; i++) {
        T[i] = T0;
    }
    time = 0.0;
    while(time < t_end) {
        time += tau;
        alfa[0] = 2 * a * tau * lamda / (2 * a * tau * (lamda + kapa1*h) + lamda*Math.pow(h,2));
        beta[0] = (lamda * Math.pow(h,2) * T[0] + 2 * a * tau * kapa1*h*Te1) /
                    (2 * a * tau * (lamda + kapa1*h)+lamda*Math.pow(h,2));
    for(i = 1; i < N - 1; i++) {
        ai = lamda / Math.pow(h,2);
        bi = 2.0*lamda/Math.pow(h,2)+ro*c/tau;
        ci = lamda / Math.pow(h, 2);
        fi = -ro*c*T[i]/tau;
        alfa[i] = ai/(bi-ci*alfa[i-1]);
        beta[i] = (ci*beta[i-1]-fi) / (bi-ci*alfa[i-1]);
    }
    T[N-1] = (lamda * Math.pow(h,2) * T[N-1] + 2 * a * tau*(lamda*beta[N-2]+kapa2*h*Te2))
            /(lamda * Math.pow(h,2) + 2 * a * tau*(lamda*(1-alfa[N-2])+kapa2*h));
    for(i = N - 2; i >= 0; i--) {
        T[i] = alfa[i] * T[i+1] + beta[i];
    }
    }
    }
READ ALSO
Как вывести массив в div

Как вывести массив в div

При нажатие на кнопку должна произойти функция которая будет выводить значение input в массив, а массив в divКак вывести массив в div ?

109
Не видит константу как исправить?

Не видит константу как исправить?

Почему при добавление в массив значение под элемента - logKeyForView, а не его значение? Как это исправитьПолучается что он не видит эту константу

163
Как разбить js файл на модули?

Как разбить js файл на модули?

Подскажите, пожалуйста, как разделить js код на несколько файлов и импортировать их в этот файл

155