Как найти точку пересечения

Kashi

Доброе время суток.Столкнулся с такой проблемой что не могу найти точку пересечения. Как можно найти её математический? привожу пример
public void ConChart()
        {
            try
            {
                GraphPane zPane2 = zedG2.GraphPane;
 
                zPane2.YAxis.Type = AxisType.Log;
 
                zPane2.CurveList.Clear();
 
                PointPairList list2 = new PointPairList();
                PointPairList list3 = new PointPairList();
 
                // Подпись графика.
                zPane2.Title.Text = "Imprutity Concentrattion";
                zPane2.XAxis.Title.Text = "x, nm";
                zPane2.YAxis.Title.Text = "C, m-3";
 
                //  Размер шрифтов графика.
                zPane2.XAxis.Scale.FontSpec.Size = 10;
                zPane2.YAxis.Scale.FontSpec.Size = 10;
 
                ****** _xmn, _xmx, _stp, _nb, _xmax, _step;
                int _time;
 
                _xmn = Convert.********(_xminT.Text);
                _xmx = Convert.********(_xmaxT.Text);
                _stp = Convert.********(_cStepT.Text);
                _nb = Convert.********(_nbPar.Text);
                _time = Convert.ToInt32(_timeT.Text);
 
                _xmax = _xmx / 1e+9;
                _step = _stp / 1e+9;
 
                zPane2.XAxis.Scale.MajorStep = _step;
 
                for (var _conThick = _xmn; _conThick <= _xmax; _conThick += _step)
                {
                    ****** ExpC, ZnamC, DifC, ZnamS;
                    int temp;
                    
                    temp = Convert.ToInt32(_cTempT.Text);
                    ZnamS = k * temp ;
                    ZnamC = -Ea / ZnamS;
 
                    ExpC = Math.Exp(ZnamC);
 
                    DifC = D0 * ExpC;
 
                    ****** valDif, const1, const2, const3, const4, _endpar;
                    valDif = 2 * (Math.Sqrt(DifC * _time));
 
                    const1 = 0.278393 * (_conThick / valDif);
                    const2 = 0.230389 * (_conThick / valDif) * (_conThick / valDif);
                    const3 = 0.000972 * (_conThick / valDif) * (_conThick / valDif) * (_conThick / valDif);
                    const4 = 0.078108 * (_conThick / valDif) * (_conThick / valDif) * (_conThick / valDif) * (_conThick / valDif);
 
                    _endpar = (1 / (1 + const1 + const2 + const3 + const4));
 
                    ****** Cxt;
 
                    Cxt = Cs * (_endpar * _endpar * _endpar * _endpar);
                    ****** _ConThick = _conThick * 1e9;
 
 
                    listBox3.Items.Add(Cxt.ToString("0.#E+0"));
                    listBox4.Items.Add(_ConThick.ToString("0"));
 
                    list2.Add(_conThick, Cxt);
                    list3.Add(_conThick, _nb);
                    listBox6.Items.Add(_nb);
                }
6 ответов

Kashi

идей совсем нет?


Kashi

Точка пересечения в данном случае является функцией зависимой от x и Y.В Вашем случае прямая имеет Y = const ,а кривая Y зависит от X.Я думаю нужен цикл пробегающий по координатам прямой и кривой линии .При совпадении координат Stop цикл.Это она.(.)


Kashi

Cxt = Cs * (_endpar * _endpar * _endpar * _endpar);
Откуда взялось Cs и чему оно равно? Почему "_endpar * _endpar * _endpar * _endpar", а не Math.Pow(_endpar, 4)? Выложите лучше функцию полностью, так не понятно.


Kashi

Да, прошу прощения. Вот целиком все константы...
private ****** Ea = 3.5;
private ****** D0 = 1.1e-03;
private ****** k = 8.62e-05;
private ****** Cs = 4e+26;
 
public void ConChart()
        {
            try
            {
                GraphPane zPane2 = zedG2.GraphPane;
 
                zPane2.YAxis.Type = AxisType.Log;
 
                zPane2.CurveList.Clear();
 
                PointPairList list2 = new PointPairList();
                PointPairList list3 = new PointPairList();
                PointPairList list4 = new PointPairList();
 
                // Подпись графика.
                zPane2.Title.Text = "Imprutity Concentrattion";
                zPane2.XAxis.Title.Text = "x, nm";
                zPane2.YAxis.Title.Text = "C, m-3";
 
                //  Размер шрифтов графика.
                zPane2.XAxis.Scale.FontSpec.Size = 10;
                zPane2.YAxis.Scale.FontSpec.Size = 10;
 
                ****** _xmn, _xmx, _stp, _nb, _xmax, _step;
                int _time;
 
                _xmn = Convert.********(_xminT.Text);
                _xmx = Convert.********(_xmaxT.Text);
                _stp = Convert.********(_cStepT.Text);
                _nb = Convert.********(_nbPar.Text);
                _time = Convert.ToInt32(_timeT.Text);
 
                _xmax = _xmx / 1e+9;
                _step = _stp / 1e+9;
 
                zPane2.XAxis.Scale.MajorStep = _step;
 
                for (var _conThick = _xmn; _conThick <= _xmax; _conThick += _step)
                {
                    ****** ExpC, ZnamC, DifC, ZnamS;
                    int temp;
                    
                    temp = Convert.ToInt32(_cTempT.Text);
                    ZnamS = k * temp ;
                    ZnamC = -Ea / ZnamS;
 
                    ExpC = Math.Exp(ZnamC);
 
                    DifC = D0 * ExpC;
 
                    ****** valDif, const1, const2, const3, const4, _endpar;
                    valDif = 2 * (Math.Sqrt(DifC * _time));
 
                    const1 = 0.278393 * (_conThick / valDif);
                    const2 = 0.230389 * (_conThick / valDif) * (_conThick / valDif);
                    const3 = 0.000972 * (_conThick / valDif) * (_conThick / valDif) * (_conThick / valDif);
                    const4 = 0.078108 * (_conThick / valDif) * (_conThick / valDif) * (_conThick / valDif) * (_conThick / valDif);
 
                    _endpar = (1 / (1 + const1 + const2 + const3 + const4));
 
                    ****** Cxt;
 
                    Cxt = Cs * (_endpar * _endpar * _endpar * _endpar);
                    ****** _ConThick = _conThick * 1e9;
 
 
                    listBox3.Items.Add(Cxt.ToString("0.#E+0"));
                    listBox4.Items.Add(_ConThick.ToString("0"));
 
                    list2.Add(_conThick, Cxt);
                    list3.Add(_conThick, _nb);
                    listBox6.Items.Add(_nb);
                }
 
                LineItem myCurve2 = zPane2.AddCurve("con", list2, Color.Red, SymbolType.Diamond);
                LineItem myCurve3 = zPane2.AddCurve("NP", list3, Color.Black, SymbolType.Diamond);
 
                zPane2.XAxis.Scale.MinAuto = true;
                zPane2.XAxis.Scale.MaxAuto = true;
 
                zPane2.YAxis.Scale.MinAuto = true;
                zPane2.YAxis.Scale.MaxAuto = true;
 
                zedG2.AxisChange();
 
                zedG2.Visible = true;
                zedG2.Invalidate();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


Kashi

Kashi, нужно найти корень уравнения f(x) - 1027 = 0, как находятся корни - гуглите, простейший метод - дихотомический поиск, выглядит так:
        static void Main()
        {
            Console.WriteLine(Dichotomy(Sqrt, -10, 10, 0.001));
        }
 
        static ****** Sqrt(****** x)
        {
            return x*x*x;
        }
 
        private static ******? Dichotomy(Func<******,******> f, ****** a, ****** b, ****** eps)
        {
            ****** x = a, y = b;
            if (f(x)*f(y) >= 0) //Если функция принимает один знак, корней нет
                return null;
            while (Math.Abs(x - y) > eps)
            {
                ****** center = (x + y)/2;
                if (Math.Sign(f(center)) == Math.Sign(f(x)))
                    x = center;
                else
                    y = center;
            }
            int mineps = (int) (1/eps);
            return Math.Round(x, mineps < 15 ? mineps : 15);
        }
находит корень заданной функции (в данном примере - y = x3) с заданной точностью.


Kashi

спасибо, попробую