Решение уравнения методом Ньютона - PascalABC.NET
Формулировка задачи:
Помогите плииз написать программу на паскале для решения уравнения методом ньютона x^3+6,6*x^2-29,05*x+22,64=0, также чтобы оформление вычисления выполняла подпрограмма и если можно, чтобы строился график функции.
Решение задачи: «Решение уравнения методом Ньютона»
textual
Листинг программы
uses graphABC; const e=0.0001; xn=-10; xk=5; function F(x:real):real; begin F:=x*x*x+6.6*x*x-29.05*x+22.64; end; function F1(x:real):real; begin F1:=3*x*x+13.2*x-29.05; end; function newton(a:real):real; var b:real; begin repeat b:=a; a:=b-F(b)/F1(b); until abs(a-b)<e; newton:=a end; var k:array[1..3] of real; a,b,x,max,min,mx,my,dx:real; x0,y0,n,i:integer; s,s1:string; begin x:=0; n:=0; a:=xn; b:=a+0.5; repeat if F(a)*F(b)<0 then begin n:=n+1; k[n]:=newton((a+b)/2); end ; a:=b; b:=a+0.5; until a>xk; x0:=0; {найдем максимум и минимум для масштаба по У} x:=xn; max:=F(xn); min:=F(xn); while x<=xk do begin if F(x)>max then max:=F(x); if F(x)<min then min:=F(x); x:=x+0.1; end; x0:=2*windowwidth div 3; mx:=(x0-10)/-xn;{масштаб по Х} y0:=windowheight div 2; if max>abs(min) then my:=(y0-10)/max{по У} else my:=(y0-10)/-min; line(0,y0,windowwidth,y0);{оси} line(x0,0,X0,windowheight); for i:=1 to 20 do{максимальное количество засечек в одну сторону} begin if i mod 2=0 then begin line(x0-3,y0-round(i*my*10),x0+3,y0-round(i*my*10));{засечки на оси У} line(x0-3,y0+round(i*my*10),x0+3,y0+round(i*my*10)); {подпись оси У} str(i*10,s); textout(x0-30,y0-round(i*my*10),s);{соответственно засечкам} textout(x0-35,y0+round(i*my*10),'-'+s); end; line(x0+round(i*mx),y0-3,x0+round(i*mx),Y0+3); {засечки на оси Х} line(x0-round(i*mx),y0-3,x0-round(i*mx),Y0+3); str(i,s); {подпись оси Х} textout(x0+round(i*mx),y0+10,s); textout(x0-round(i*mx),y0+10,'-'+s); end; {центр} textout(x0+5,y0+10,'0'); {подписи концов осей} textout(windowwidth-10,y0-20,'X'); textout(x0+5,10, 'Y'); {график} x:=xn; dx:=0.001; while x<=xk do begin setpixel(x0+round(x*mx),y0-round(F(x)*my),clRed); x:=x+dx; end; for i:=1 to 3 do begin setpencolor(clBlue); setbrushcolor(clBlue); circle(x0+round(k[i]*mx),y0-round(F(k[i])*my),2); str(i,s1); str(k[i]:0:2,s); setfontcolor(clBlack); setbrushstyle(bsClear); textout(120,y0+70+i*20,'x'+s1+'='+s); end; {название} textout(70,y0+50,'Уравнение x^3+6,6*x^2-29,05*x+22,64=0'); textout(120,y0+70,'Корни:'); end.
Объяснение кода листинга программы
- Объединение функций на языке PascalABC.Net
- Константа e=0.0001
- Начальные приближения для метода Ньютона: xn=-10, xk=5
- Функция F(x:real):real; для вычисления значения функции
- Функция F1(x:real):real; для вычисления производной функции F(x)
- Функция newton(a:real):real; для нахождения корня уравнения методом Ньютона
- Переменные a, b, x, max, min, mx, my, dx:real; для промежуточных вычислений
- Переменные x0, y0, n, i:integer; для подсчета количества засечек и итераций
- Переменные k:array[1..3] of real; для хранения найденных корней
- Оси X и Y отображаются линиями с помощью функций line(0,y0,windowwidth,y0) и line(x0,0,X0,windowheight)
- Подписи осей X и Y выводятся с помощью функций textout(windowwidth-10,y0-20,'X') и textout(x0+5,10, 'Y')
- График функции отображается с помощью цикла while x<=xk do и функции setpixel(x0+round(xmx),y0-round(F(x)my),clRed)
- Корни уравнения вычисляются с помощью цикла for i:=1 to 3 do и функции newton((a+b)/2)
- Подписи корней выводятся с помощью функций textout(120,y0+70+i*20,'x'+s1+'='+s)
- Название уравнения выводится с помощью функции textout(70,y0+50,'Уравнение x^3+6,6x^2-29,05x+22,64=0')
- Строка с названиями корней выводится с помощью функции textout(120,y0+70,'Корни:')
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д