Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2019, 17:56   #1
spender
 
Регистрация: 30.08.2019
Сообщений: 7
По умолчанию как при помощи методов решить уравнение неявного вида x^3+y^3+xy-1=0 для 0<x<1 c шагом h

здраствуйте хотел узнать как при помощи методов решить уравнение неявного вида x^3+y^3+xy-1=0 для 0<x<1 c шагом h. Знаю что просить решать задания по программированию не корректно на сайте для программистов, но все же надеюсь на вашу помощь. PS на языке C.
spender вне форума Ответить с цитированием
Старый 26.11.2019, 20:52   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Я не знаю, что у тебя за методы , но эта неявно заданная функция на заданном интервале прописывается приблизно так (по секрету - это не уравнение, это функция; 1 уравнение с 2 переменными имеет ∞ множество решений)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var x,y,z,zt,p:double ; i: integer;
//==============================
function half (var rere: double): double ;
var be,en,zz,zbe,yy,x3,del: double;
begin
  be := y - 0.01 ;
  en := y + 0.01 ;
  x3 := x*x*x ;
  del := 1.0 ;
  zbe := x3 + be*be*be + x*be - 1.0 ;
  while (del>0.0005) do
    begin
      yy := (be + en) / 2.0 ;
      zz := x3 + yy*yy*yy + x*yy - 1.0 ;
      if ((zz>0) and (zbe>0)) or ((zz<0) and (zbe<0)) then be := yy
          else en := yy ;
      del := en-be
    end ;
  rere := zz ;
  Result := yy
end;
//--------------------------
begin
Memo1.Lines.Add('   x           y              z') ;
x := 0 ; y := 1 ; p := 0 ;
  // Т.к. 0^3 + y^3 + 0*y - 1 = 0 ; следов.  y^3 = 1
Memo1.Lines.Add(Format
   ('%6.3f %12.6f -> %12.6f',[x,y,p])) ;
x := 0.1 ;
while x<0.9 do
  begin
    zt := 0 ;
    for i := 0 to 300 do
      begin
        y := i*0.01 - 2.0 ;
        z := x*x*x + y*y*y + x*y - 1.0 ;
        if (i=0) or ((z>0) and (zt>0)) or ((z<0) and (zt<0)) then zt:= z
        else
             begin
               // Определили интервал локализации по изменению знака
               y := half(p) ;
               // Вычислили y с точностью до 0.001
               Memo1.Lines.Add(Format
                  ('%6.3f %12.6f -> %12.6f',[x,y,p])) ;
               break
             end ;
      end ;
    x := x + 0.1 ;
  end ;
x := 1 ; y := 0 ; p := 0 ;
  // Т.к. 1^3 + y^3 + 1*y - 1 =0 ; следов.  (y^3 + 1*y) = 0
Memo1.Lines.Add(Format
   ('%6.3f %12.6f -> %12.6f',[x,y,p])) ;

end ;
Извини что на Delphi, Но на С++ ( на С, насколько помнит мой склероз, никаких методов нет, только процедуры - он не ООП ) перепрёшь сам без труда, я надеюсь. Делов-то -- заменить := на =
Изображения
Тип файла: jpg xy3.JPG (25.7 Кб, 43 просмотров)

Последний раз редактировалось digitalis; 26.11.2019 в 22:28.
digitalis вне форума Ответить с цитированием
Старый 27.11.2019, 20:30   #3
spender
 
Регистрация: 30.08.2019
Сообщений: 7
По умолчанию

храни тебя бог
spender вне форума Ответить с цитированием
Старый 27.11.2019, 23:30   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

аминь
digitalis вне форума Ответить с цитированием
Старый 28.11.2019, 21:24   #5
spender
 
Регистрация: 30.08.2019
Сообщений: 7
По умолчанию

но если кто то может на си сдлеать был бы благодарен
spender вне форума Ответить с цитированием
Старый 28.11.2019, 21:50   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Дык тебе же мэтоды нужны, а это ООП, а Си - не ООП. У меня Си на старом винчестере остался, а так бы вечерком, накормив котов, перекинул бы.
Но суть ты уловил? Это - не решение уравнения, это - неявно заданная функция, которую надо табулировать на заданном интервале с заданным шагом.
digitalis вне форума Ответить с цитированием
Старый 28.11.2019, 22:03   #7
spender
 
Регистрация: 30.08.2019
Сообщений: 7
По умолчанию

я никак не могу понять ка найти Y. получается перебираем значения х с 0 до 1 с интервалом 0.1, но именно как мы находим значение Y не понимаю((
spender вне форума Ответить с цитированием
Старый 28.11.2019, 23:17   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Ну это просто, как семечки.
Рассчитываем функцию 2 переменных x и y - вместо = 0 принимаем = z. Переменная Х на каждом шаге расчета нам задана - меняется от 0 до 1 с шагом h. Теперь ( опять же на каждом шаге ) ищем такой Y (область поиска я взял от балды [-2..+1]), чтобы при нем переменная z была близка к нулю, т.е. ищем интервал локализации - на концах интервала z имеет разный знак - значит, проскакивает через 0. Нашли - теперь пошло уточнение найденного Y . Я взял простейший из методов - деление пополам. Или по забугорному - дихотомию. Знаем значение функции на краях интервала локализации, вычисляем посередине. Тот край интервала, у которого знак совпал с вычисленной "серёдкой" - отбрасываем. Сузили в 2 раза - и так до опупения до получения разностей абсцисс (del) меньшей, чем допустимое отклонение. Например, при y=0.4 z>0, при y=0,45 z<0 . Вычисляем z в средней точке y=0,45. Если там z>0, получаем интервал [0,45..05], если нет - [0,4..0,45] . Эту мегазадачу у нас выполняет функция half, попутно в rere возвращает нам значение z, чтобы было видно, насколько близко функцию мы притиснули к нулю .
На концах интервала эта бодяга не работает, но мы ее легко вычислим простой алгеброй (см. коммент).
Вот так, в таком аксепте.

Последний раз редактировалось digitalis; 28.11.2019 в 23:55.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решить уравнение при помощи методов Эйлера и Рунге Кутта Alexandrietz Общие вопросы C/C++ 0 30.11.2017 22:10
Даны вещественные числа a, b, c(a≠0). Решить уравнение вида ax4+bx2+c=0 ( Delphi ) shablakov Помощь студентам 1 24.06.2013 13:33
Решить методами Эйлера и Рунге-Кутта уравнение вида y' = F(x,y) austyuzhin Помощь студентам 1 31.05.2013 17:28
уравнение линейной алгебры вида Irisk Помощь студентам 0 18.05.2011 13:20