IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> численные методы (Builder c++), решение нелинейных уравнений
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


Вот листинг


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<math.h>

#include "urav.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
float f(float x)
{
// return x*x*x + 3*x - 2;
return x*x*x + x - 5;
}
float fdx(float x)
{// return 3*x*x +3;
return 3*x*x +1;
}
float fd2x(float x)
{
return 4*x;
}
float absolute(float x)
{ return x < 0 ? -x : x;
}
void chordes(float a, float b, float eps, TLabel* lbl3, TLabel* lbl4, TLabel* lbl5)
{
if(f(a)*f(b) < 0)
{
ShowMessage("Хорды: a и b неправильные");
return;
}
float x0 = a;
float xf = b;
if(f(a)*fd2x(a) > 0)
{
x0 = b;
xf = a;
}
int step = 1;
float x1 = x0 - f(x0)*(xf-x0)/(f(xf)-f(x0));
while(absolute(x1-x0) > eps)
{
x0 = x1;
x1 = x0 - f(x0)*(xf-x0)/(f(xf)-f(x0));
step = step + 1;
}
lbl3->Caption = x1;
lbl4->Caption = f(x1);
lbl5->Caption = step;
}
void __fastcall TForm1::sek(float a, float b, float eps)
{
if(f(a)*f(b) < 0)
{
ShowMessage("Секущие : a и b неправильные");
return;
}
float x0 = a;
float x1 = a + eps;
if(f(a)*fd2x(a) < 0)
{
x0 = b;
x1 = b - eps;
}
int step = 1;
float x = x1 - f(x1)*(x1 - x0)/(f(x1) - f(x0));
x0 = x1;
x1 = x;
while(absolute(x1-x0) > eps)
{
x = x1 - f(x1)*(x1 - x0)/(f(x1) - f(x0));
x0 = x1;
x1 = x;
step = step + 1;
}
Label11->Caption = x1;
Label12->Caption = f(x1);
Label13->Caption = step;
}

void __fastcall TForm1::kasat(float a, float b, float eps)
{
if(f(a)*f(b) < 0)
{
ShowMessage("Касательные: a и b неправильные");
return;
}
float x0 = a;
if(f(a)*fd2x(a) < 0)
{
x0 = b;
}
int step = 1;
float x1 = x0 - f(x0)/fdx(x0);
while(absolute(x1-x0) > eps)
{
x0 = x1;
x1 = x0 - f(x0)/fdx(x0);
step = step + 1;
}
Label17->Caption = x1;
Label18->Caption = f(x1);
Label25->Caption = step;
}

void __fastcall TForm1::combi(float a, float b, float eps)
{
if ((abs(f(a)*fd2x(a)) == f(a)*fd2x(a)) &&
(abs(f(b)*fd2x(b)) == f(b)*fd2x(b)))
{
ShowMessage("Данные: a и b неправильные");
return;
}
float x0=a;
float t0=b;

if(f(a)*fd2x(a) > 0)
{
x0 = b;
t0 = a;
}

int step = 1;
float x = x0 - f(x0)*(t0-x0)/(f(t0)-f(x0));
float t = t0 - f(t0)/fdx(t0);
while (absolute(x0-t0) < eps)
{
x0 = (x0+t0)/2;
t0 = f((x0+t0)/2);
step = step + 1;
}
Label28->Caption = x0;
Label30->Caption = t0;
Label32->Caption = step;

}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
float a, b, eps;
// ShowMessage("Vvedite a, b, epsilon: ");
a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
eps = StrToFloat(Edit3->Text);
chordes(a, b, eps, Label3, Label4, Label7);
sek(a, b, eps);
kasat(a, b, eps);
combi(a, b, eps);
}
//---------------------------------------------------------------------------



в чем выявлены ошибки:

касательные, секущие и хорды вроде считает, но в комбинированные (combi) какая-то засада.
Выдает без расчетов "Данные: a и b неправильные", если убрать

if ((abs(f(a)*fd2x(a)) == f(a)*fd2x(a)) &&
(abs(f(b)*fd2x(b)) == f(b)*fd2x(b)))
{
ShowMessage("Данные: a и b неправильные");
return;
}



то вроде запускается, но не считает.
Если здесь в label убрать нули

while (absolute(x0-t0) < eps)
{
x0 = (x0+t0)/2;
t0 = f((x0+t0)/2);
step = step + 1;
}
Label28->Caption = x0;
Label30->Caption = t0;
Label32->Caption = step;

}



то получается какой то расчет и всё время со степом 1. Явно математическая часть не верна. Кто знает как её реализовать, подскажите пожалуйста

Сообщение отредактировано: leahov -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
в комбинированные (combi) какая-то засада.
Выдает без расчетов "Данные: a и b неправильные"
Содержимое Edit-ов приведи... Если a = 1, и b = 1.5, например, то ничего не выдает, условие ложно, программа продолжает работу...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


в едиты кроме eps (его вводимое содержимое 0,0001) вводятся любые числа, насчет чисел с запятыми не было требований, поэтому берем только целые числа
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Блин, ты что, издеваешься? Я тебя русским языком спросил, что ТЫ ввел, что получил такой результат? Я тебе привел данные, которые его НЕ выдают (причем это были первые же введенные мной 2 числа). А о том, что это должны быть только целые я должен был догадаться телепатически? Вообще-то меня учили, что если используется StrToFloat и переменная типа float - то можно и вещественные вводить (странно, правда?), ничего противоречащего этому утверждению в том куске программы, который ты привел, я не увидел.

А вообще - как хочешь. Не хочешь, чтоб тебе помогали - я не навязываюсь.

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


volvo извини конечно что заставил понервничать, просто я ещё не спец в программировании твоего уровня и не понял что ты имел ввиду. Например ввожу в едит а = 2 , едит б = 5 , eps = 0.0001
получаю результат : sek, chordes, kasat - посчитала, причем у sek и kasat результат практически оди и тот же, на combi выдает данные а и б неправильные, если ввожу как ты a = 1, и b = 1.5 то оно просто пишет эти значения без расчетов, и степ всегда равен 1, так же и с другими значениями, она их просто вписывает туда
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


так может правильней?

while (absolute(x0-t0) < eps)
{
x = (x0+t0)/2;
t = f((x0+t0)/2);
step = step + 1;
}
Label28->Caption = x;
Label30->Caption = t;
Label32->Caption = step;



но степ по прежнему 1
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 104
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Я не в курсе, как работает программа, но по-моему, так НЕ правильней...
В цикле while x0 и t0 не меняются, а от этих переменных зависит условие выхода из цикла, значит, либо порга будет закливаться, либо этот кусок вообще не выполнится...
вроде так smile.gif


--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.11.2020 13:53
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name