Нелинейные уравнения

Ответить
prikolist
Сообщения: 36
Зарегистрирован: 19 ноя 2008, 13:09

06 июн 2009, 21:51

Здравствуйте программисты! Дали решить 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 уравнения,которые нужно решить:
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Вот так,получилось:

Код: Выделить всё

#include <vcl>
#include <iostream>
#include <cmath>
using namespace std;
const double epsilon = 1e-3;
double f1(double x);
double f2(double x);
void integral(double (*f) (double), double start, double end);
int main()
{
cout<<"   --------Metod leviyx priamoygolnikov---------"<<endl<<endl;
integral(&f1,0,2);
integral(&f2,0.001,8);
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-log10(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;
}
подскажите пожалуйста,как реализовать теперь методом хорд,касательной,комбинированого и итераций. Зараннее благодарю.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
azrael
Сообщения: 86
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

07 июн 2009, 16:08

Вы у себя последнюю строку раскомментируйте и посмотрите что получится - точность одна тысячная, а значение функции f1 отлично от нуля на три тысячных.
В f2 вообще считает один раз.
Проблема в условии выхода из цикла.
Ответить