Статья по теме:
Демо JavaScript:
ParD:
NumberOfIntervals:
Random X
var ctx = document.getElementById("paintbox").getContext('2d'); var x = []; var y = []; var x1=[]; var y1=[]; function Hermit(t){ //функция для построения многочлена var k; k=(t-x[0])/(x[1]-x[0]); return (1-3*k*k+2*k*k*k)*y[0]+(3*k*k-2*k*k*k)*y[1]+(x[1]-x[0])*((k-2*k*k+k*k*k)*y[2]+(-k*k+k*k*k)*y[3]); } function compareNumeric(a, b) { //необходимо для сортировки if (a > b) return 1; if (a == b) return 0; if (a < b) return -1; } function start() { let d=Number(document.getElementById('d').value); //получаем значения, вводимые пользователем let N=Number(document.getElementById('N').value); rand=document.getElementById('rand').checked; //проврека checkbox var i,j,t=-1,k=0,h; x=[]; y=[]; x1=[]; y1=[]; ctx.clearRect(0,0,1000,1000); ctx.strokeStyle = 'gray'; ctx.beginPath(); //единичный квадрат ctx.moveTo(150,150); ctx.lineTo(150,550); ctx.lineTo(550,550); ctx.lineTo(550,150); ctx.closePath(); ctx.stroke(); ctx.strokeStyle = 'black'; ctx.beginPath(); //координатные оси ctx.moveTo(350,0); ctx.lineTo(350,600); ctx.moveTo(0,350); ctx.lineTo(750,350); ctx.stroke(); while (t <= 1 ) { //вычисляем значания самой функции(изображено красной линией) x1.push(t); y1.push(1/(1+d*x1[k]*x1[k])); t = t + 1/100; k++; } for (i=0;i< y1.length;i++) y1[i]=-y1[i]; ctx.strokeStyle='red'; ctx.beginPath(); //рисуем функцию for(let t2=0; t2<x1.length; t2++){ sx=350+200*x1[t2]; sy=350+200*y1[t2]; if(t2==0) ctx.moveTo(sx, sy); else ctx.lineTo(sx, sy); } ctx.stroke(); ctx.strokeStyle = 'black'; ctx.beginPath(); h=2/N; if (rand==true){ //случайный массив абсцисс x[0]=-1; x[N]=1; for (k=1;k<N;k++) x[k]=Math.random()* (1+1) -1; x.sort(compareNumeric); } for (i=-1;i<=1-h;i+=h){ if (rand==false){ x[0]=i; x[1]=i+h; y[0]=1/(1+d*x[0]*x[0]); //значение функции в точке y[1]=1/(1+d*x[1]*x[1]); y[2]=(-2*d*x[0])/((1+d*x[0]*x[0])*(1+d*x[0]*x[0])); //значение производной в точке y[3]=(-2*d*x[1])/((1+d*x[1]*x[1])*(1+d*x[1]*x[1])); for (j=0;j<=3;j++) y[j]=-y[j]; for(let t1=x[0]-3/100;t1<=x[1]+3/100;t1=t1+1/100){ //рисуем многочлен sx=350+200*t1; sy=350+200*Hermit(t1); if(t1==x[0]-3/100) ctx.moveTo(sx, sy); else ctx.lineTo(sx, sy); } } else { y[0]=1/(1+d*x[0]*x[0]); //аналогичная процедура для случайных X y[1]=1/(1+d*x[1]*x[1]); y[2]=(-2*d*x[0])/((1+d*x[0]*x[0])*(1+d*x[0]*x[0])); y[3]=(-2*d*x[1])/((1+d*x[1]*x[1])*(1+d*x[1]*x[1])); for (j=0;j<=3;j++) y[j]=-y[j]; for(let t1=x[0]-3/100;t1<=x[1]+3/100;t1=t1+1/100){ sx=350+200*t1; sy=350+200*Hermit(t1); if(t1==x[0]-3/100) ctx.moveTo(sx, sy); else ctx.lineTo(sx, sy); } } ctx.stroke(); //рисуем точки ctx.beginPath(); ctx.arc(350+200*x[1],350+200*y[1],3,0,2*Math.PI); ctx.stroke(); ctx.fillStyle='green'; ctx.fill(); ctx.beginPath(); ctx.arc(350+200*x[0],350+200*y[0],3,0,2*Math.PI); ctx.stroke(); ctx.fillStyle='green'; ctx.fill(); x.splice(0,1); } }