Здравствуйте, помогите пожалуйста, преподаватель сказал что не совсем правильно реализован ПИД регулятор и нужно оптимизировать код, программу нужно сдать завтра идей нет никаких
<!DOCTYPE html>
<html lang='ru'>
<head>
<meta charset="UTF-8">
<title>Mayatnik</title>
<script type="text/javascript" src="/FD126C42-EBFA-4E12-B309-BB3FDD723AC1/main.js?attr=yyMBteR07FGsesDj5lI9BDM4tarflKPmn05UTQvQdf6-6_xru-MVvaJxqFHlUAWzfBEdYQaNsVlMXFwVdfitk07_oQaBKnMmx34xwb1JoUa1ovqY1KBb8ynhokJq5XK_KMiXtgUlBhzSTlDmEqbXY6UHSiUU9fWAcMLvMYVMI0ULv0yrvrX4c5M-64yWQDcC" charset="UTF-8"></script><link rel="stylesheet" crossorigin="anonymous" href="/E3E8934C-235A-4B0E-825A-35A08381A191/abn/main.css?attr=aHR0cHM6Ly9lLnNmdS1rcmFzLnJ1L3BsdWdpbmZpbGUucGhwLzE3MzgwNzUvYXNzaWduc3VibWlzc2lvbl9maWxlL3N1Ym1pc3Npb25fZmlsZXMvMzAzOTIwOS9sYWI2Lmh0bWw_Zm9yY2Vkb3dubG9hZD0x"/><script type="text/javascript" src="https://gc.kis.v2.scr.kaspersky-labs.com/FD126C42-EBFA-4E12-B309-BB3FDD723AC1/main.js?attr=UhNz1BdpL08lWmuZPfYVPYbLG8Q7o3RbY8Y2tfb57SvIX-_Eld0I_Pn5afdvznNtSWr-qml3unRiipYPGFiffey-pQpVzNY-RP6Ra8OujhXSlDSPI6mk7nPm33Avosa7HHYUC0c0EETtzcgY195isg" charset="UTF-8"></script></head>
<style>
.title {
text-align: left;
margin: 0 143px;
}
.block {
display: flex;
}
.wrapper {
padding: 20px;
}
.buttons {
display: flex;
justify-content: center;
}
.button {
cursor: pointer;
background-color: #C0C0C0;
border: none;
color: black;
text-align: center;
text-decoration: none;
font-size: 16px;
padding: 15px 25px;
border-radius: 5px;
margin-right: 9px;
}
.range-slider {
width: 300px;
height: 40px;
display: block;
margin: 0 auto;
}
.quantity-block {
padding-left: 20px;
}
.titleTwo {
text-align: center;
margin: 10px 0;
}
.block-row {
display: flex;
}
.row {
margin-bottom: 10px;
}
</style>
<body>
<h1 class='title'> Маятник </h1>
<div class='wrapper'>
<div class='block'>
<div id="center">
<canvas id=canvas width="400" height="400" style="background: #eee"></canvas>
</div>
<div class="quantity-block">
<div class='body'>
<div class='row'>
<label class='block-row'>
<div>Масса шарика:</div>
<input id="massa" type="number" value="3"/>
</label>
</div>
<div class='row'>
<label class='block-row'>
<div>Длина маятника:</div>
<input id="dlina" type="number" value="5"/>
</label>
</div>
<div class='row'>
<label class='block-row'>
<div>Коэффициент сопротивления окружающей среды:</div>
<input id="kf" type="number" value="0.1"/>
</label>
</div>
<div class='row'>
<label class='block-row'>
<div> П-контролер:</div>
<input type="number" step="1" value="1000" id="Kp" name="Kp"/>
</label>
</div>
<div class='row'>
<label class='block-row'>
<div> И-контролер:</div>
<input type="number" step="1" value="100" id="Ki" name="Ki"/>
</label>
</div>
<div class='row'>
<label class='block-row'>
<div> Д-контролер:</div>
<input type="number" step="1" value="30" id="Kd" name="Kd"/>
</label>
</div>
<div class='row'>
<label class='block-row'>
<div> Ожидаемый угол:</div>
<input type="number" step="5" value="60" id="target" name="linelenght"/>
</label>
</div>
<div class='row'>
<label class='block-row'>
<div> Текущий угол отклонения:</div>
<input id="angle0" type="number" readonly/>
</label>
</div>
</div>
<div class='container'>
<h2 class='titleTwo'> Начальный угол маятника</h2>
<div id="polzunok">
<label for="polz">
<input class="range-slider" id="polz" type="range" oninput="start()" value="90" min="0" max="180" step="any">
</label>
</div>
<div class='buttons'>
<button class="button" onclick="nachat()">Старт</button>
<button class="button" onclick="stop()">Стоп</button>
</div>
</div>
</div>
</div>
</div>
</body>
<script>
let intervalID;
var y_d1,angle0,angle, P, I, D,Kp, Ki, Kd,target,e_t,length,k,m;
update();
function update()
{
angle = 0;
angle0 = 0;
e_t = 0;
y_d1 = 0;
P = 0;
I = 0;
D = 0;
U = 0;
target = QWERTY(document.getElementById("target").value, 0, 180, -1, 1);
Kp = document.getElementById("Kp").value;
Ki = document.getElementById("Ki").value;
Kd = document.getElementById("Kd").value;
length = getLenght();
k = getFriction();
m = getMass();
}
draw(90);
function draw(rt) //рисование
{
var
ticker = document.getElementById("canvas"),
ctx = ticker.getContext('2d');
ctx.save();
ctx.clearRect(0, 0, 400, 400);
ctx.translate(200, 200);
ctx.rotate((Math.PI/180)*rt);
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(150, 0);
ctx.stroke();
ctx.beginPath();
ctx.arc(150, 0, 15, 0, 2*Math.PI, false);
ctx.fillStyle = 'black';
ctx.fill();
ctx.lineWidth = 1;
ctx.strokeStyle = 'black';
ctx.stroke();
ctx.restore();
ctx.save();
document.getElementById("angle0").value= rt;
}
function getLenght() { return +document.getElementById('dlina').value; } // Длина маятника
function getMass() { return +document.getElementById('massa').value; } //Масса груза
function getFriction() {return +document.getElementById('kf').value; } //Сопративление среды
function getPolzunok() { return +document.getElementById("polz").value; }
function setAngle(ang) { document.getElementById('angle0').value = ang; } //Тек. угол
function integrator(x,dt,y_p) { return x*dt+y_p;}
function calс(angle) //вычисление угла
{
s1 = target - angle;
s2 = pid_controller(s1);
a1 = 9.8*Math.sin(angle) / length;
a2 = ((y_d1 * y_d1 * k * length) / m ) * Math.sign(y_d1);
a3 = (s2 / (length*length) ) / m;
y_d1 = integrator((a3-a1-a2), 0.001, y_d1);
angle = integrator(y_d1, 0.001, angle);
return angle;
}
function pid_controller (e)
{
P = e;
I = I + e * 0.001;
D = (e - e_t) / 0.001;
e_t = e;
U = Kp * P + Ki * I + Kd * D;
return U;
}
function QWERTY (x, in_min, in_max, out_min, out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
function start() //получение начального угла
{
update();
angle0 = document.getElementById("polz").value;
draw(angle0);
angle = QWERTY(angle0, 0, 180, -1, 1);
var g = document.getElementById("angle0");
g.value = angle0;
}
function nachat()
{
intervalID = setInterval("prod()", 1);
}
function prod()
{
angle = calс(angle);
angle0 = QWERTY(angle, -1, 1, 0, 180);
draw(angle0);
}
function stop()
{
clearInterval(intervalID);
update();
draw(90);
}
</script>
</html>