Код:
f(x) = x — 5 — 1/3*cos(2*x+1) + (2*x)/(2+x^2);
a = 0; b = 1; % интервал, на котором ищем решение
M1 = max(abs(diff(f(x), x, 2))); % оценка модуля производной второго порядка
eps = 1e-5; % заданная точность
N_apr = ceil(log(M1*(b-a)/eps)/log(2)); % априорная оценка числа итераций
x0 = (a+b)/2; % начальное приближение
N_post = 0; % счетчик числа итераций
if abs(x1-x0) < eps*(1-M1)/M1 % проверка условия окончания итераций
end
Conversion to logical from sym is not possible.
disp([‘Приближенное решение: x = ‘, num2str(x1)]);
disp([‘Число итераций: N = ‘, num2str(N_post)]);
disp([‘Априорная оценка числа итераций: N_apr = ‘, num2str(N_apr)]);
Ошибка:
Conversion to logical from sym is not possible.
Error in untitled3 (line 14)
if abs(x1-x0) < eps*(1-M1)/M1 % проверка условия окончания итераций
Пыталась поменять в 13 строке на:
if abs(x1-x0) < double(eps)*(1-double(M1))/double(M1)
Тогда выдает ошибку:
Error using symengine
Unable to convert expression containing symbolic variables into double array. Apply ‘subs’ function
first to substitute values for variables.
Error in sym/double (line 868)
Xstr = mupadmex(‘symobj::double’, S.s, 0);
Error in untitled3 (line 13)
if abs(x1-x0) < double(eps)*(1-double(M1))/double(M1) % проверка условия окончания итераций
Related documentation
0 / 0 / 0 Регистрация: 22.06.2013 Сообщений: 25 |
|
1 |
|
12.08.2013, 10:19. Показов 4818. Ответов 11
Здраствуйте! Решил начать осваивать MatLab! Нарисовал простенькую схему, но MatLab выдаёт ошибку! Пробывал разные версии, разные источники питания и разные нагрузки, текст ошибки везде один и тот же. Подскажите как исправить? И заодно литературу, по simulink! Миниатюры
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
12.08.2013, 10:19 |
Ответы с готовыми решениями: ошибка в MatLab Ошибка в Matlab PCM Matlab ошибка В чем ошибка? (MatLab) 11 |
453 / 279 / 13 Регистрация: 13.11.2012 Сообщений: 588 Записей в блоге: 1 |
|
12.08.2013, 11:15 |
2 |
НУ судя по всему, блоки ты брал из Simscape. Собственно говоря, после собрания цепи Симулинк моделирует её работу во времени, соответственно решая системы уравнений. Так вот «решателей» (читай алгоритмов) огромное множество. Тебе же надо настроить Solver, который в данном случаи автоматически не выбирается. Попробуй подключить блок Solver Configuration
1 |
939 / 839 / 121 Регистрация: 23.11.2012 Сообщений: 2,489 |
|
12.08.2013, 11:18 |
3 |
zarus87, думаю Вам не хватает вот этого блока. Что касается литературы: лучше всего конечно же здесь или здесь. Также есть разные интернет-ресурсы.
1 |
453 / 279 / 13 Регистрация: 13.11.2012 Сообщений: 588 Записей в блоге: 1 |
|
12.08.2013, 11:35 |
4 |
Попробуй подключить блок Solver Configuration
zarus87, думаю Вам не хватает вот этого блока.
0 |
R2D2 |
12.08.2013, 11:44
|
Не по теме:
Попробуй подключить блок Solver Configuration Да, да
0 |
lomt |
12.08.2013, 11:47
|
Не по теме: Я думал, ты просто не заметил моего сообщения)))
0 |
0 / 0 / 0 Регистрация: 22.06.2013 Сообщений: 25 |
|
12.08.2013, 12:37 [ТС] |
7 |
Попробовал! Настраивал solver, тоже ошибку пишет! и ещё собрал из элементов SimPowerSystems… Миниатюры
0 |
453 / 279 / 13 Регистрация: 13.11.2012 Сообщений: 588 Записей в блоге: 1 |
|
12.08.2013, 12:41 |
8 |
Ну в первом случаи у тебя количество переменных превышает количество уравнений, а во второй схеме из SimPowerSystem надо вставить блок Powergui
1 |
0 / 0 / 0 Регистрация: 22.06.2013 Сообщений: 25 |
|
12.08.2013, 18:37 [ТС] |
9 |
Заработало! А как сейчас подключить элемент scope, чтобы увидеть синусоиду? Миниатюры
0 |
939 / 839 / 121 Регистрация: 23.11.2012 Сообщений: 2,489 |
|
12.08.2013, 19:09 |
10 |
zarus87, файлик сбрось.
0 |
0 / 0 / 0 Регистрация: 22.06.2013 Сообщений: 25 |
|
12.08.2013, 19:20 [ТС] |
11 |
вот! MatLab2013a
0 |
939 / 839 / 121 Регистрация: 23.11.2012 Сообщений: 2,489 |
|
12.08.2013, 19:32 |
12 |
Смотри.
1 |
error
Выдать ошибку и отобразить сообщение
Синтаксис
Описание
пример
error(
выдает ошибку и отображает сообщение об ошибке.msg
)
error(
отображает сообщение об ошибке, которое содержит символы преобразования форматирования, такие как используемые с MATLAB®msg
,A1,...,An
)
sprintf
функция. Каждый символ преобразования в msg
преобразован в одно из значений A1,...,An
.
error(
включает ошибочный идентификатор на исключении. Идентификатор позволяет вам отличить ошибки и управлять тем, что происходит, когда MATLAB сталкивается с ошибками. Можно включать любой из входных параметров в предыдущих синтаксисах.errID
,___)
пример
error(
выдает ошибку поля в скалярной структуре.errorStruct
)
пример
error(
обеспечивает предложенное исправление для исключения. Можно включать любой из входных параметров в предыдущих синтаксисах. correction
,___)
Примеры
свернуть все
Бросок ошибки
msg = 'Error occurred.';
error(msg)
Бросок ошибки с форматированным сообщением
Выдайте отформатированное сообщение об ошибке с разрывом строки. Необходимо задать больше чем один входной параметр с error
если вы хотите, чтобы MATLAB преобразовал специальные символы (такие как n
) в сообщении об ошибке. Включайте информацию о классе переменной n
в сообщении об ошибке.
n = 7; if ~ischar(n) error('Error. nInput must be a char, not a %s.',class(n)) end
Error.
Input must be a char, not a double.
Если вы только используете один входной параметр с error
, затем MATLAB не преобразует n
к разрыву строки.
if ~ischar(n) error('Error. nInput must be a char.') end
Error. nInput must be a char.
Выдайте ошибку с идентификатором.
if ~ischar(n) error('MyComponent:incorrectType',... 'Error. nInput must be a char, not a %s.',class(n)) end
Error.
Input must be a char, not a double.
Используйте MException.last
просмотреть последнее неперехваченное исключение.
exception = MException.last
exception = MException with properties: identifier: 'MyComponent:incorrectType' message: 'Error. Input must be a char, not a double.' cause: {0x1 cell} stack: [0x1 struct]
Бросок структуры ошибки
Создайте структуру с полями идентификатора и сообщением. Чтобы сохранить пример простым, не используйте поле стека.
errorStruct.message = 'Data file not found.'; errorStruct.identifier = 'MyFunction:fileNotFound';
errorStruct = message: 'Data file not found.' identifier: 'MyFunction:fileNotFound'
Выдайте ошибку.
Выдайте ошибку с предложенным исправлением
Создайте функциональный hello
это требует одного входного параметра. Добавьте предложенный входной параметр "world"
к сообщению об ошибке.
function hello(audience) if nargin < 1 aac = matlab.lang.correction.AppendArgumentsCorrection('"world"'); error(aac, 'MATLAB:notEnoughInputs', 'Not enough input arguments.') end fprintf("Hello, %s!n", audience) end
Вызовите функцию без аргумента.
Error using hello (line 4)
Not enough input arguments.
Did you mean:
>> hello("world")
Входные параметры
свернуть все
msg
— Информация об ошибке
вектор символов | строковый скаляр
Информация об ошибке в виде вектора символов или строкового скаляра. Это индикаторы сообщения как сообщение об ошибке. Чтобы отформатировать сообщение, используйте escape-последовательности, такие как t
или n
. Также можно использовать любые спецификаторы формата, поддержанные sprintf
функция, такая как %s
или %d
. Задайте значения для спецификаторов преобразования через A1,...,An
входные параметры. Для получения дополнительной информации см. Форматирующий текст.
Примечание
Необходимо задать больше чем один входной параметр с error
если вы хотите, чтобы MATLAB преобразовал специальные символы (такие как t
N
S
, и %d
) в сообщении об ошибке.
Пример: 'File not found.'
errID
— Идентификатор для ошибки
вектор символов | строковый скаляр
Идентификатор для ошибки в виде вектора символов или строкового скаляра. Используйте ошибочный идентификатор, чтобы помочь идентифицировать источник ошибки или управлять выбранным подмножеством ошибок в вашей программе.
Ошибочный идентификатор включает одно или несколько полей компонента и мнемоническое поле. Поля должны быть разделены двоеточием. Например, ошибочный идентификатор с полем component
компонента и мнемоническое поле
mnemonic
задан как 'component:mnemonic'
. И мнемонические поля компонента должны каждый начаться с буквы. Оставшиеся символы могут быть буквенно-цифровым индикатором (A–Z, a–z, 0–9) и символы нижнего подчеркивания. Никакие пробельные символы не могут появиться нигде в errID
. Для получения дополнительной информации смотрите MException
.
Пример: 'MATLAB:singularMatrix'
Пример: 'MATLAB:narginchk:notEnoughInputs'
A1,...,An
Значения
вектор символов | строковый скаляр | числовой скаляр
Значения, которые заменяют спецификаторы преобразования в msg
В виде вектора символов, строкового скаляра или числового скаляра.
errorStruct
— Информация о сообщении об ошибке
скалярная структура
Информация о сообщении об ошибке в виде скалярной структуры. Структура должна содержать по крайней мере одно из этих полей.
message |
Сообщение об ошибке. Для получения дополнительной информации смотрите |
identifier |
Ошибочный идентификатор. Для получения дополнительной информации смотрите |
stack |
Поле стека для ошибки. Когда |
correction
— Предложенное исправление для этого исключения
matlab.lang.correction.AppendArgumentsCorrection
возразите | matlab.lang.correction.ConvertToFunctionNotationCorrection
возразите | matlab.lang.correction.ReplaceIdentifierCorrection
объект
Советы
-
Когда вы выдаете ошибку, MATLAB получает информацию об этом и хранит ее в структуре данных, которая является объектом
MException
класс. Можно получить доступ к информации в объекте исключения при помощиtry/catch
. Или, если ваша программа завершает работу из-за исключения и возвращает управление в Командную строку, можно использоватьMException.last
. -
MATLAB не прекращает осуществление программы, если ошибка происходит в
try
блок. В этом случае MATLAB передает управление кcatch
блок. -
Если все входные параметры к
error
пусты, MATLAB не выдает ошибку.
Расширенные возможности
Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.
Указания и ограничения по применению:
Не оказывает влияния в автономном коде, даже когда обнаружение ошибки времени выполнения включено. Смотрите Генерируют Автономный Код C/C++, Который Обнаруживает и Ошибки времени выполнения Отчетов (MATLAB Coder).
Основанная на потоке среда
Запустите код в фоновом режиме с помощью MATLAB® backgroundPool
или ускорьте код с Parallel Computing Toolbox™ ThreadPool
.
Эта функция полностью поддерживает основанные на потоке среды. Для получения дополнительной информации смотрите функции MATLAB Запуска в Основанной на потоке Среде.
Массивы графического процессора
Ускорьте код путем работы графического процессора (GPU) с помощью Parallel Computing Toolbox™.
Указания и ограничения по применению:
-
Эта функция принимает массивы графического процессора, но не работает на графическом процессоре.
Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox).
Представлено до R2006a
Я пытаюсь добавить переключатель в конструктор приложений, используя этот код:
function SwitchValueChanged(app, event)
value = app.Switch.Value;
if (value == 'Off')
app.SaveOIButton.Enable = 'Off';
app.OpenOIButton.Enable = 'Off';
end
if (value == 'On')
app.SaveOIButton.Enable = 'On';
app.OpenOIButton.Enable = 'On';
end
end
Но я получаю эту ошибку:
Arrays have incompatible sizes for this operation.
Error in Mie/SwitchValueChanged (line 82)
if (value == 'Off')
Related documentation
Error while evaluating Switch PrivateValueChangedFcn.
Есть идеи, почему?
1 ответ
Лучший ответ
Попробуйте (я не запускал):
function SwitchValueChanged(app, event)
switch app.Switch.Value
case 'Off'
app.saveOIButton.Enable = 'off';
app.openOIButton.Enable = 'off';
case 'On'
app.saveOIButton.Enable = 'on';
app.openOIButton.Enable = 'on';
end
end
Я использовал переключатель для оценки выражения и выбора выполнения одной из нескольких групп операторов. Каждый выбор — это случай. Блок switch проверяет каждый случай до тех пор, пока одно из выражений case не станет истинным (https:/ /www.mathworks.com/help/matlab/ref/switch.html)
2
AsiJapan
15 Янв 2022 в 15:08
1.- Your codes doesn’t plot V
and D
: Your code plots D(V)
and T(V)
2.- T
is completely flat, despite taking part in the inner for
loop calculations with T(i)=Tsl*(rho(i)/1.2).^0.75;
as it had to be somehow modified.
But in fact it remains constant for all samples of V
, constant temperature (°C ?), and for all laps of the outer for
loop sweeping variable h
within [0:1:8]
.
The produced T(V)
functions are the flat lines.
3.- Then you try building a 3rd function f
that you put as if f(V)
only but in fact it’s f(V,T)
with the right hand side of the function with a numerical expression, without a symbolic expression, the symbolic expression that fzero
expects to attempt zero solving.
In MATLAB Zero finding has to be done either symbolically or numerically.
A symbolic zero-finding function like fzero
doesn’t work with numerical expressions like the ones you have calculated throughout the 2 loops for h
and for alpha
.
Examples of function expressions solvable by fzero
:
3.1.-
fun = @(x)sin(cosh(x));
x0 = 1;
options = optimset('PlotFcns',{@optimplotx,@optimplotfval});
x = fzero(fun,x0,options)
3.2.-
fun = @sin; % function
x0 = 3; % initial point
x = fzero(fun,x0)
3.3.- put the following 3 lines in a separate file, call this file f.m
function y = f(x)
y = x.^3 - 2*x - 5;
and solve
fun = @f; % function
x0 = 2; % initial point
z = fzero(fun,x0)
3.4.- fzeros
can solve parametrically
myfun = @(x,c) cos(c*x); % parameterized function
c = 2; % parameter
fun = @(x) myfun(x,c); % function of x alone
x = fzero(fun,0.1)
4.- So since you have already done all the numerical calculations and no symbolic expression is supplied, it’s reasonable to solve numerically, not symbolically.
To this purpose there’s a really useful function called intersections.m
written by Douglas Schwarz available here
clear all; close all;clc
W = 10000; %[N]
S = 40; %[m^2]
AR = 7;
cd0 = 0.01;
k = 1 / pi / AR;
clalpha = 2*pi;
Tsl=800;
figure(1);
ax1=gca
hold(ax1,'on');xlabel(ax1,'V');ylabel(ax1,'D');grid(ax1,'on');
title(ax1,'1st graph');
reczeros={}
for h=0:1:8;
i=0;
for alpha = 1:0.25:12
i=i+1;
rho(i)=1.2*exp(-h/10.4);
cl(i) = clalpha * alpha * pi/180;
V(i) = sqrt(2*W/rho(i)/S/cl(i));
L(i) = 0.5 * rho(i) * V(i) * V(i) * S * cl(i);
cd(i) = cd0 + k * cl(i) * cl(i);
D(i) = 0.5 * rho(i) * V(i) * V(i) * S * cd(i);
clcd(i) = cl(i)/cd(i);
p(i) = D(i)*V(i);
ang(i) = alpha;
T(i)=Tsl*(rho(i)/1.2).^0.75;
end
plot(ax1,V,D); hold(ax1,'on');
plot(ax1,V,T);
[x0,y0]=intersections(V,D,V,T,'robust');
reczeros=[reczeros [x0 y0]];
for k1=1:1:numel(x0)
plot(ax1,x0,y0,'r*');hold(ax1,'on')
end
end
Because at each pair D(V)
T(V)
there may be no roots, 1 root or more than 1 root, it makes sense to use a cell, reczeros
, to store whatever roots obtained.
To read obtained roots in let’s say laps 3 and 5:
reczeros{3}
=
55.8850 692.5504
reczeros{5}
=
23.3517 599.5325
55.8657 599.5325
5.- And now the 2nd graph, the function that is defined in a different way as done in the double for
loop:
P = 0.5*V.*V.*rho.*S.*cd-T;
figure(2);
ax2=gca
hold(ax2,'on');xlabel(ax2,'V');ylabel(ax2,'P');grid(ax2,'on');
title(ax2,'2nd graph')
plot(ax2,V,P)
plot(ax2,V,T)
[x0,y0]=intersections(V,T,V,P,'robust');
for k1=1:1:numel(x0)
plot(ax2,x0,y0,'r*');hold(ax2,'on')
end
format short
V0=x0
P0=y0
V0 =
86.9993
P0 =
449.2990