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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2009, 21:33   #1
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
Плохо Нелинейные уравнения

Здравствуйте программисты! Дали решить 2 нелинейных уравнения,фото ниже. Нужно отделить графически или аналитически корни уравнений(найти отрезок [a,b] на котором находится только один корень) и уточнить по одному корню для каждого уравнения с точностью E=0.001 c помощью:
-метода половинного деления;
-метода хорд;
-метода касательной;
-комбинированного метода;
-метода итераций.

Я попробывал методом половинного деления, проверьте пожалуйста, просто, мне нужно чтоб выдавало результат 2-х интегралов, а выдаёт одного, и не находит корня.
Вот исходник:

Код:
#include <vcl>
#include <iostream>
#include <cmath>
using namespace std;
const double epsilon = 1e-2;

double f(double x)
{
    return 9.25*pow(x,4)-3*x*x+6.25*x;
}

int main()
{
    double a, b, c;
    a = 0;
    b = 2;
    while (b - a > epsilon){
        c = (a + b) / 2;
        if(f(b) * f(c) < 0)
            a = c;
        else
            b = c;
    }
    cout << (a + b) / 2 << endl;
    system("pause");
    return 0;
}
Вот 2 уравнения,которые нужно решить:
Изображения
Тип файла: jpg 1111.jpg (5.0 Кб, 69 просмотров)

Последний раз редактировалось prikolist; 06.06.2009 в 21:47.
prikolist вне форума Ответить с цитированием
Старый 06.06.2009, 23:15   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот тут:
Код:
while (b - a > epsilon){
        c = (a + b) / 2;
        if(f(a) * f(c) < 0)
            a = c;
        else
            b = c;
    }
Цитата:
Сообщение от prikolist
просто, мне нужно чтоб выдавало результат 2-х интегралов, а выдаёт одного, и не находит корня.
В каком смысле? У вас программа для нахождения одного корня одного уравнения (правого). Если нужно еще и первое, то добавьте еще одну функцию и прокрутите цикл еще раз (а лучше сделать функцию, которая все это будет делать и передавать ей две другие функции по ссылке).
Цитата:
и не находит корня.
Что значит не находит?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 06.06.2009, 23:40   #3
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Попробывал так, но получается что-то не то, у меня должен получится корень, в одном из уравнений, а не получается, и выводит одно и тоже. Вот как написал:
Код:
#include <vcl>
#include <iostream>
#include <cmath>
using namespace std;
const double epsilon = 1e-2;

double f1(double x);
double f2(double x);
void integral(double (*f) (double) );

int main()
{
cout<<"   --------Metod polovinogo delenia---------";
integral(&f1);
integral(&f2);
system("pause");
return 0;
}

double f1(double x)
{
    return 9.25*pow(x,4)-3*x*x+6.25*x;
}

double f2(double x)
{
return 2*x-log(x)-7;
}

void integral(double (*f) (double) )
{
    double a, b, c;
    a = 0;
    b = 2;
    while (b - a > epsilon){
        c = (a + b) / 2;
        if(f(b) * f(c) < 0)
            a = c;
        else
            b = c;
    }
    cout << (a + b) / 2 << endl;
    system("pause");
  
}

Последний раз редактировалось prikolist; 06.06.2009 в 23:43.
prikolist вне форума Ответить с цитированием
Старый 06.06.2009, 23:45   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Во-первых, вы не исправили то, на что я указал.
Во-вторых, вот что у меня выводит:
Код:
0.00390625
1.00391
Первый похож на ответ. А для второго, видимо, нужно выбрать другие начальные границы.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.06.2009, 00:00   #5
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

А как для другого изменить начальные, границы, в каком месте,ведь эти границы и изменятся для обоих уравнений. И ещё,у меня вывело вот так результат,странный какой-то,какая-то ошибка log: SING error, и корня целого не вижу. Вот фото:
Изображения
Тип файла: jpg pol_del.jpg (12.3 Кб, 56 просмотров)

Последний раз редактировалось prikolist; 07.06.2009 в 00:03.
prikolist вне форума Ответить с цитированием
Старый 07.06.2009, 00:04   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Измените функцию вот так:
Код:
void integral(double (*f) (double), double start, double end )
{
    double a, b, c;
    a = start;
    b = end;
    while (fabs(b - a) >= epsilon)
    {
        c = (a + b) / 2;
        if(f(a) * f(c) < 0)
            a = c;
        else
            b = c;
    }
    cout << (a + b) / 2 << endl;
    cout<<f((a+b)/2)<<endl;
}
И при вызове посылайте границы:
Код:
integral(&f1,0,2);
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.06.2009, 00:10   #7
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Попробывал вот так, но останавливается курсор возле первой ссылки. Вот как написал:

Код:
#include <vcl>
#include <iostream>
#include <cmath>
using namespace std;
const double epsilon = 1e-2;

double f1(double x);
double f2(double x);
void integral(double (*f) (double) );

int main()
{
cout<<"   --------Metod polovinogo delenia---------"<<endl<<endl;
integral(&f1,0,1);
integral(&f2);
system("pause");

}

double f1(double x )
{
    return 9.25*pow(x,4)-3*x*x+6.25*x;
}

double f2(double x)
{
return 2*x-log(x)-7;
}

void integral(double (*f) (double), double start, double end )
{
    double a, b, c;
    a = start;
    b = end;
    while (fabs(b - a) >= epsilon)
    {
        c = (a + b) / 2;
        if(f(a) * f(c) < 0)
            a = c;
        else
            b = c;
    }
    cout << (a + b) / 2 << endl;
    cout<<f((a+b)/2)<<endl;
}

Последний раз редактировалось prikolist; 07.06.2009 в 00:54.
prikolist вне форума Ответить с цитированием
Старый 07.06.2009, 00:18   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну а прототип функции-то, вообще-то, тоже поменять нужно.
И сделайте точность побольше. Например, 1e-4.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.06.2009, 00:25   #9
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Прототип прописал, но в этом месте,останавливается уже на &f2.
Код:
integral(&f1,0,2);
integral(&f2);
system("pause");
Если прописать integral(&f2,0,2);
выдаст такой результат:
(Но нужно только 2 цифры чтоб было в результате, 1 корень,другой не корень)
Изображения
Тип файла: jpg pol_del.jpg (12.1 Кб, 60 просмотров)
prikolist вне форума Ответить с цитированием
Старый 07.06.2009, 00:33   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Попробуйте что-нибудь такое:
Код:
integral(&f2,0.001,8);
И у вас в функции f2 ошибка - десятичный логарифм не log, а log10.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дифференциальные уравнения StudentPolitech Общие вопросы C/C++ 12 07.06.2009 17:48
Вычислить уравнения systemmind Общие вопросы C/C++ 3 26.02.2009 18:31
Решение уравнения Datrav Паскаль, Turbo Pascal, PascalABC.NET 2 06.06.2008 08:23
Рекуррентные уравнения RIO Помощь студентам 1 13.01.2008 15:27