Al4enok
|
|
« : 23 Ноябрь 2012, 17:08:43 » |
|
Программа для решения нелинейных уравнений методом ньютона(метод касательных), не до конца работает, почему-то, после ввода на консоли погрешности, она перестает работать, не могу разобраться в чем дело.
#include <StdAfx.h> #include <conio.h> #include <math.h> #include <iomanip> #include<iostream> using namespace std; double a[4]={0}, b[3]={0}, c[2]={0}, prec=0.00001; double minim=0, maxim=0; void Hello(void); void Input(); void Derivative(); void Calculation(); double Calc_Fun(double); double Calc_First(double); double Calc_Second(double); int main() { Hello(); Input(); Derivative(); Calculation(); return 0; } void Hello(void) { cout<<"Programma dlja rescenija uravneniy metodom Nyutona.\n\n"; } void Input() { cout<<"Uravnenie imeet vid"<<endl <<"a1*x^3+a2*x^2+a3*x+a4=0"<<endl<<endl; for (int i=0;i<4;i++) { cout<<"Vvedite znachenie koeficienta a["<<i+1<<"] : "; cin>>a ; } cout<<endl<<"Neobhodimo ukazat' intervly poiska resceniya."<<endl <<"Vvedite nizhnyuu granicu poiska : "; cin>>minim; cout<<"Vvedite verhnyuu granicu poiska : "; cin>>maxim; while(minim==maxim||minim>maxim) { cout<<"\n Nizhnyaa granica dolzhna byt' men'sce verhney i ne mozhet byt' ravna ey ."<<endl <<"Povtorite vvod nizhney granicy : "; cin>>minim; cout<<"Povtorite vvod verhney granicy : "; cin>>maxim; } cout<<"Vvedite dopustimuyu pogreshnost' : "; cin>>prec; } void Derivative() { b[0]=a[0]*3; b[1]=a[1]*2; b[2]=a[2]; c[0]=b[0]*2; c[1]=b[1]; cout<<"\n\n\n" <<"Ishodnoe uravnenie imeet vid : \n\n" <<a[0]<<"x^3+("<<a[1]<<")x^2+("<<a[2]<<")x+("<<a[3]<<")=0\n\n" <<"Pervaya proizvodnaya imeet vid : \n\n" <<"f'(x)="<<b[0]<<"x^2+("<<b[1]<<")x+("<<b[2]<<")\n\n" <<"Vtoraya proizvodnaya imeet vid : \n\n" <<"f''(x)="<<c[0]<<"x+("<<c[1]<<")\n\n"; } void Calculation() { double x=0, m=0; cout<<"-------------------------------------------------"<<endl <<"| Xn | f(Xn) | |f(Xn)|/m |"<<endl <<"-------------------------------------------------"<<endl; if (abs(Calc_Fun(minim))*abs(Calc_Second(minim))>0) x=minim; else x=maxim; if (Calc_First(minim)>Calc_First(maxim)) m=abs(Calc_First(maxim)); else m=abs(Calc_First(minim)); cout<<"|"; cout.width(15);cout.precision(10); cout<<x; cout<<"|"; cout.width(15);cout.precision(10); cout<<Calc_Fun(x); cout<<"|"; cout.width(15);cout.precision(10); cout<<(fabs(Calc_Fun(x))/m); cout<<"|\n"; while((fabs(Calc_Fun(x))/m)>prec) { x=(x-(Calc_Fun(x)/Calc_First(x))); cout<<"|"; cout.width(15);cout.precision(10); cout<<x; cout<<"|"; cout.width(15);cout.precision(10); cout<<Calc_Fun(x); cout<<"|"; cout.width(15);cout.precision(10); cout<<fabs(Calc_Fun(x))/m; cout<<"|\n"; } cout<<"-------------------------------------------------"; } double Calc_Fun(double x) { return (a[0]*x*x*x+a[1]*x*x+a[2]*x+a[3]); } double Calc_First(double x) { return (b[0]*x*x+b[1]*x+b[2]); } double Calc_Second(double x) { return (c[0]*x+c[1]); }
|
|
« Последнее редактирование: 26 Ноябрь 2012, 18:32:15 от Al4enok »
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
cin>>a; вот это неверно
|
|
|
Записан
|
|
|
|
Al4enok
|
cin>>a; вот это неверно
в проге cin >>a(i), это просто здесь недопечаталось почему-то.
|
|
« Последнее редактирование: 23 Ноябрь 2012, 18:17:31 от Al4enok »
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
квадратные скобки должны быть
|
|
|
Записан
|
|
|
|
Al4enok
|
квадратные скобки должны быть
я знаю, так и есть, здесь не отражается почему-то, поэтому и заменила круглыми скобками
|
|
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
какие данные вводите?
|
|
|
Записан
|
|
|
|
Al4enok
|
какие данные вводите?
например: а1=2; а2=3; а3=4; а4=5; нижняя граница 0, верхняя 1, погрешность 0.00001, как только жму Enter - на мгновение появляется результат какой-то, который я не успеваю даже запомнить, и сразу же пропадает консоль. По идее еще должно выводиться полученное уравнение и ее производная, но ничего нет(((
|
|
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
http://codepad.org/ZCly9dSgСмотрите вот ваша программа (код изменился только входными данными, чтобы они по умолчанию были) И она работает и всё нормально выдаёт. Может попробуйте паузу в конце вывода? Возможно программа работает как надо и выводит то, что надо. Но после отработки окно закрывается и вы просто не видите результат.
|
|
|
Записан
|
|
|
|
Al4enok
|
http://codepad.org/ZCly9dSgСмотрите вот ваша программа (код изменился только входными данными, чтобы они по умолчанию были) И она работает и всё нормально выдаёт. Может попробуйте паузу в конце вывода? Возможно программа работает как надо и выводит то, что надо. Но после отработки окно закрывается и вы просто не видите результат. Да, после отработки окно закрывается и я не вижу результат, об этом я и писала. Уже не знаю что и делать и как поставить на паузу((((
|
|
« Последнее редактирование: 24 Ноябрь 2012, 19:28:25 от Al4enok »
|
Записан
|
|
|
|
Hackett
|
1) Например, запускайте ваш скомпилированный файл из консоли 2) Например, добавьте в самом конце cin после вывода результата
|
|
|
Записан
|
|
|
|
Al4enok
|
1) Например, запускайте ваш скомпилированный файл из консоли 2) Например, добавьте в самом конце cin после вывода результата
Увы, ничего у меня не получается на мгновение выводит результат, возможно правильный и сразу же закрывается, остается только отладка.
|
|
|
Записан
|
|
|
|
DimaFromGrodno
|
Вы вообще в какой среде пишете? (может стесняется человек лишние cin тыкать в код ) А вообще, не советывал бы я вам так double сравнивать
|
|
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
про double сравнение ничего страшного учитывая, что оно в ИЛИ с оператором больше. конечно лучше сразу одним оператором записать, но и так работать будет
добавляйте в конце
char c; cin >> c;
если после этого не будет останавливаться - то только отладкой - проблема конкретно в вашем компиляторе (кстати что за он? )
|
|
|
Записан
|
|
|
|
Al4enok
|
Работаю в среде Visual Studio 2010 Добавлено: 26 Ноябрь 2012, 10:53:49
про double сравнение ничего страшного учитывая, что оно в ИЛИ с оператором больше. конечно лучше сразу одним оператором записать, но и так работать будет
добавляйте в конце
char c; cin >> c;
если после этого не будет останавливаться - то только отладкой - проблема конкретно в вашем компиляторе (кстати что за он? )
Возможно глупый вопрос, но где именно в конце добавить char c; cin >> c;
|
|
|
Записан
|
|
|
|
Hackett
|
.... void Calculation() { double x=0, m=0; cout<<"-------------------------------------------------"<<endl <<"| Xn | f(Xn) | |f(Xn)|/m |"<<endl <<"-------------------------------------------------"<<endl; if (abs(Calc_Fun(minim))*abs(Calc_Second(minim))>0) x=minim; else x=maxim; if (Calc_First(minim)>Calc_First(maxim)) m=abs(Calc_First(maxim)); else m=abs(Calc_First(minim)); cout<<"|"; cout.width(15);cout.precision(10); cout<<x; cout<<"|"; cout.width(15);cout.precision(10); cout<<Calc_Fun(x); cout<<"|"; cout.width(15);cout.precision(10); cout<<(fabs(Calc_Fun(x))/m); cout<<"| "; while((fabs(Calc_Fun(x))/m)>prec) { x=(x-(Calc_Fun(x)/Calc_First(x))); cout<<"|"; cout.width(15);cout.precision(10); cout<<x; cout<<"|"; cout.width(15);cout.precision(10); cout<<Calc_Fun(x); cout<<"|"; cout.width(15);cout.precision(10); cout<<fabs(Calc_Fun(x))/m; cout<<"| "; } cout<<"-------------------------------------------------"; СЮДА НАПРИМЕР } ...
Все же почитайте какую-нибудь книгу по c++ Добавлено: 26 Ноябрь 2012, 11:06:18
Работаю в среде Visual Studio 2010
Вроде если запускать в дебаг моде, то пишет в свою консоль... Нету сейчас под рукой VS2010 с крестами
|
|
|
Записан
|
|
|
|
|
RILLey_ELf
Гость
|
жалко, что вы не понимаете, где конец _вашей_ программы дальше будет только хуже.
|
|
|
Записан
|
|
|
|
Al4enok
|
жалко, что вы не понимаете, где конец _вашей_ программы дальше будет только хуже. я прекрасно понимаю, где конец моей программы, и также понимаю что до хорошего программиста мне еще далеко))
|
|
|
Записан
|
|
|
|
|