Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 27.06.2014
Сообщений: 7
1

Минимизация методом касательных (Перевести код из C++)

27.06.2014, 02:37. Просмотров 1864. Ответов 9
Метки faq+ (Все метки)

Вот собственно сама программа в с++.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void KasMet(double a,double b,double E)
{
        double z[2],y[2],s,yr,zr,xw,yw;
        cout<<"funkciya vipuklaya na vsem intervale, => metod primenim\n";
        y[0]=F(a);
        z[0]=Fp(a);
        y[1]=F(b);
        z[1]=Fp(b);
        int N=4;
        do
        {
                s=((z[1]*b-z[0]*a)-(y[1]-y[0]))/(z[1]-z[0]);
                yr=F(s);
                zr=Fp(s);
                if(zr==0)
                {
                        xw=s;
                        yw=yr;
                        break;
                }
                if(zr>0)
                {
                        b=s;
                        y[1]=yr;
                        z[1]=zr;
                }
                else
                {
                        a=s;
                        y[0]=yr;
                        z[0]=zr;
                }
                N+=2;
        }
        while(b-a>2*E);
        if(zr!=0)
        {
                xw=(a+b)/2;
                yw=F(xw);
        }
        cout<<"Metod kasatelnih:\nx'="<<xw<<"\ny'="<<yw<<"\nN="<<N<<"\nPress any key\n";
        getch();
}


Как она будет выглядеть в матлабе?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2014, 02:37
Ответы с готовыми решениями:

Минимизация методом парабол. (перевести из c++ в матлаб)
Вот программа. #include&lt;iostream.h&gt; #include&lt;math.h&gt; #include&lt;conio.h&gt; #include&lt;stdio.h&gt;...

Решить уравнение любым методом(методом половинного деления,методом простой интеграции,методом касательных)
Решить уравнение: 0,1*x^2-x*ln(x)=0 любым методом(методом половинного деления,методом простой...

Задача в маткаде методом половинного деления или методом касательных
Помогите,пожалуйста, решить задачу в маткад! Дано трансцендентное уравнение: a1*x^m+e^(a2*x)=a3...

Сделать двумя методами: методом хорд и методом Ньютона (касательных)
Пусть известны функции спроса D(p) и предложения S(p) для некоторого товара Т. Найти равновесную...

9
0 / 0 / 0
Регистрация: 27.06.2014
Сообщений: 7
27.06.2014, 02:44  [ТС] 2
Вот программа в с++.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>
#include "stdafx.h"
 
double f(double x)
{double f;
f=pow(x, 3)-x+exp(-x);
return f;
}
double df(double x)
{double f;
f=3*pow(x, 2)-1-exp(-x);
return f;
}
void main()
{
const double e=0.00001;
double y1,y2, z1, z2, s, z, y, x, a=0, b=1;
int N;
//N=0; //Schetchik experimentov
y1=f(a);
y2=f(b);
z1=df(a);
z2=df(b);
N=4;
do
  {
   s=((z2*b - z1*a)-(y2-y1))/(z2-z1);
   y=f(s);
   z=df(s);
   N+=2;
   if (z==0) {x=s; break;}//smthwrng
   if (z>0) {b=s; y2=y; z2=z;}
      else {a=s; y1=y; z1=z;}
   } while (b-a>2*e);
if (z!=0) {x=(a+b)/2; y=f(x);}
printf("Metod kasatelnyh \n \n");
printf("x = %.5f \n", x);
printf("y = %.5f \n \n", y);
printf("Kol-vo experimentov: %i", N);
}


Ее надо перевести и матлаб
0
2401 / 1805 / 395
Регистрация: 15.12.2013
Сообщений: 7,717
27.06.2014, 09:07 3
Mixirist, инклуды убираете,функции переносите в отдельные m-файлы,возвращать значение без return.
Вместо закрывающей фигурной скобки инструкция end,открывающая не нужна.Для обозначения не равно,вместо != ставите ~=
+= естественно нет,пишите как положено N=N+1;
вместо printf disp.
1
936 / 836 / 121
Регистрация: 23.11.2012
Сообщений: 2,487
27.06.2014, 12:11 4
Mixirist, что делает Ваша программа?
0
5126 / 3464 / 355
Регистрация: 02.04.2012
Сообщений: 6,378
Записей в блоге: 16
27.06.2014, 14:07 5
R2D2,Metod kasatelnih
0
5126 / 3464 / 355
Регистрация: 02.04.2012
Сообщений: 6,378
Записей в блоге: 16
27.06.2014, 14:25 6
Лучший ответ Сообщение было отмечено Mixirist как решение

Решение

как-то так
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
clc;
clear;
 
e = 0.00001;
f = @(x) x.^3 - x + exp(-x);
df = @(x) 3*x.^2 - 1 - exp(-x);
 
a=0;
b=1;
N=0;
y1=f(a);
y2=f(b);
z1=df(a);
z2=df(b);
N=4;
 
ezplot(f,[a, b]), hold on
 
while 1
    s=((z2*b - z1*a)-(y2-y1))/(z2-z1);
    y=f(s);
    z=df(s);
    N = N + 2;
    if z==0 | b-a < 2*e
        x=s;
        break;
    elseif z>0
        b=s;
        y2=y;
        z2=z;
    else
        a=s;
        y1=y;
        z1=z;
    end
end
 
if z~=0
    x=(a+b)/2;
    y=f(x);
end
 
fprintf('Метод касательных \n \n');
fprintf('x = %.5f \n', x);
fprintf('y = %.5f \n \n', y);
fprintf('Количество итераций: %i \n', N);
 
 
plot(x,y,'or'), grid on
Результат:
Код
Метод касательных 
 
x = 0.70565 
y = 0.13951 
 
Количество итераций: 38
Минимизация методом касательных (Перевести код из C++)


*не могу без рисовашек
1
0 / 0 / 0
Регистрация: 27.06.2014
Сообщений: 7
28.06.2014, 00:04  [ТС] 7
А вот такую програмку вы сможете переработать? Был бы очень признателен!)))

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <iomanip.h>
#include <windows.h>
 
int N0=0, N1=0, fl;
double a=20, b=0.4, c=0.3, d=0.3,e=0.0001, x10=0.0, x20=-1.0;
 
const S=256;
 
struct point
{ double x1, x2, y; };
 
point operator+(point a, point b)
{ point t;
  t.x1=a.x1+b.x1;
  t.x2=a.x2+b.x2;
  return t;
}
point operator-(point a, point b)
{ point t;
  t.x1=a.x1-b.x1;
  t.x2=a.x2-b.x2;
  return t;
}
point operator*(double b, point a)
{ point t;
  t.x1=a.x1*b;
  t.x2=a.x2*b;
  return t;
}
point operator/(point a, double b)
{ point t;
  t.x1=a.x1/b;
  t.x2=a.x2/b;
  return t;
}
 
double f(double x1, double x2)
{ 
    double f;
    N0++;
    f=a*x1 + b*x2 + exp(c*x1*x1+d*x2*x2);
    return(f);
}
 
double fi(double l, double x1, double x2, double z)
{ double y;
  if(fl) y=f(x1-l*z,x2);
  else y=f(x1,x2-l*z);
  return y;
}
 
 double df1(double X1, double X2)
{ double dy;
  dy=a+exp(c*X1*X1+d*X2*X2)*2*c*X1;
  return dy;
}
 
 
double df2(double X1, double X2)
{ double dy;
  dy=b+exp(c*X1*X1+d*X2*X2)*2*d*X2;
  return dy;
}
 
 
 
double fdx1(double x1,double x2)
    {double fx1;
   N1++;
   fx1=a+2*c*x1*exp(c*x1*x1+d*x2*x2);
   return(fx1); }
 
 
 
double fdx2(double x1,double x2)
    { double fx2;
     N1++;
     fx2=b+2*d*x2*exp(c*x1*x1+d*x2*x2);
   return(fx2); }
 
 
  void simplex()
  { int i,k,p,d,u;
    double x1[100],x2[100],r,E,x1min,x2min,ymin;
    double y[10],yu,l1,l2,c1,c2,u1,u2;
    x1[0]=0;
    x2[0]=-1;
    r=1; E=0.0001;
       x1[1]=x1[0]+r;
       x2[1]=x2[0];
       x1[2]=x1[0];
       x2[2]=x2[0]+r;
 
      y[0]=f(x1[0],x2[0]);
      y[1]=f(x1[1],x2[1]);
      y[2]=f(x1[2],x2[2]);
      u=0;
 
      do{p=1;
 
      if(y[0]>y[1]) { if(y[0]>y[2]) {l2=0; if(y[1]>y[2]){l1=2;} else {l1=1;} } else {l2=2; l1=1;} }
        else{ if(y[1]>y[2]) {l2=1; if(y[0]>y[2]) {l1=2;} else {l1=0;} } else {l2=2; l1=0;} }
 
      if(r>E)
      {   p=0;
         if(l2==0) {c1=(1/2.0)*(x1[1]+x1[2]);}
         if(l2==1) {c1=(1/2.0)*(x1[0]+x1[2]);}
         if(l2==2) {c1=(1/2.0)*(x1[0]+x1[1]);}
 
         if(l2==0) {c2=(1/2.0)*(x2[1]+x2[2]);}
         if(l2==1) {c2=(1/2.0)*(x2[0]+x2[2]);}
         if(l2==2) {c2=(1/2.0)*(x2[0]+x2[1]);}
         k=l2;
         d=l1;
        u1=2*c1-x1[k];
        u2=2*c2-x2[k];
 
        yu=f(u1,u2);
 
         if(yu<y[k]) {  x1[k]=u1; x2[k]=u2; y[k]=yu;}
 
              else {r=r/2;  for(i=0;i<=2;i++)
                            {if(i!=d)
                            { x1[i]=(x1[i]+x1[d])/2.0;
                              x2[i]=(x2[i]+x2[d])/2.0;
                               y[i]=f(x1[i],x2[i]);
                               cout<<x1[i]<<"  "<<x2[i]<<"  "<<y[i]<<endl;}}
 
 
        u++;                             }
    }  }while(p==0);
        u--;
      x1min=x1[d];
      x2min=x2[d];
      ymin=f(x1min,x2min);
      cout<<endl<<("Kol eksperimentov:")<<N0<<" X1="<<x1min<<" X2="<<x2min<<" F="<<ymin<<endl;
      cout<<("Kol iteraci:")<<u<<endl;
      N0=0;
 
 
}
 
  void graddrob()
  { double x1[100],x2[100],A,E,g,z1,z2,d,y,y1;
    int k,h;
    k=0; g=0.4; x1[0]=0; x2[0]=-1; E=0.0001; A=0.4;
    z1=fdx1(x1[0],x2[0]);
    z2=fdx2(x1[0],x2[0]);
    N1=2; N0=0; k=0; d=pow(z1,2)+pow(z2,2);
 
     label2:
    y=f(x1[k],x2[k]);
     cout<<setw(10)<<y;
     label1:
    y1=f(x1[k]-A*z1,x2[k]-A*z2);
 
 
    if((y1-y)<-A*g*d)
      {   x1[k+1]=x1[k]-A*z1;
          x2[k+1]=x2[k]-A*z2;
           cout<<setw(14)<<x1[k+1]<<setw(14)<<x2[k+1]<<endl;
          z1=fdx1(x1[k+1],x2[k+1]);
          z2=fdx2(x1[k+1],x2[k+1]);
          d=pow(z1,2)+pow(z2,2);
 
          if(sqrt(d)>E) {k=k+1; goto label2;}
          else {
          cout<<"X1="<<x1[k+1]<<" X2="<<x2[k+1]<<" Fmin="<<f(x1[k+1],x2[k+1]);
           h=N1+N0;
           cout<<":"<<N0<<":"<<N1<<endl;
      cout<<("Kol eksperimentov:")<<h<<endl;
      cout<<("Kol iteraci:")<<k<<endl;
          }
 
 
           }
     else {A=A/2.0; goto label1;}
 
  N1=0; N0=0;
    
  }
 
 
void main()
{  int v;
   
  while(1)
  {clrscr();
   cout<<("1.Gradientnyi metod s drobleniem shaga\n");
   cout<<("2.Siplex method\n");
   cout<<("3.Go out \n");
   cout<<endl;
   cout<<("Ч.What look?:");
   cin>>v;
   switch(v)
   {
    case 1: {graddrob(); getch();} break;
    case 2: {simplex(); getch();} break;
    case 3: cout<<("End of programm.")<<endl<<("Press any key..."); getch(); exit(0);
 
    default:  cout<<("Sorry incorrected.")<<endl;
           cout<<("Press any key...");
           getch();
       }}}


Добавлено через 2 часа 1 минуту
0
5126 / 3464 / 355
Регистрация: 02.04.2012
Сообщений: 6,378
Записей в блоге: 16
28.06.2014, 09:08 8
Mixirist, эту программу разбираем в другой теме и пока что не могу ею заняться
0
0 / 0 / 0
Регистрация: 27.06.2014
Сообщений: 7
28.06.2014, 16:15  [ТС] 9
А не могли бы кинуть ссылочку на тему или вы говорите про мою же тему?
0
5126 / 3464 / 355
Регистрация: 02.04.2012
Сообщений: 6,378
Записей в блоге: 16
28.06.2014, 16:55 10
да, про твою: www.cyberforum.ru/matlab/thread1218070.html
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2014, 16:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Поиск максимума в массиве методом касательных и методом Ньютона-Рафсона
Существует массив с двумя столбцами, переменные следует обозвать х и у. Задание: написать программы...

Графическим методом выполнить локализацию корней уравнения и решить его методом хорд и касательных.
Привет=) Помогите плиз!) Задание: Графическим методом выполнить локализацию корней нелинейного...

Найти корень уравнения методом хорд и методом касательных
На языке программирования DEV C++ 5.8.2 Метод Хорда и Касательный X^3+3x^2-24x-3=0 На отрезке...

Заданы два уравнения. Необходимо каждое из них решить методом половинного деления и методом касательных
Здравствуйте, помогите пожалуйста написать программы. Заданы два уравнения. Необходимо каждое из...

Перевести код алгоритма о рюкзаке методом ветвей и границ с С++ на Java
Добрый день, уважаемые форумчане. Есть ответ на вопрос, о написание алгоритма о рюкзаке,...

Нужно перевести небольшой код из Pascal в C#: Корень уравнения методом половинного деления
Нет времени изучить язык C#, а нужно в короткие сроки перевести эту программу с Pascal на C#....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.